I have already written a basic analysis for use-after-move semantics which
just hasn't been reviewed yet. I'm not sure if it's what you'd be looking
for (take a look at the tests).

https://bugzilla.mozilla.org/show_bug.cgi?id=1186706

Michael

On Fri, Apr 29, 2016 at 12:14 AM, Jim Blandy <jbla...@mozilla.com> wrote:

> On Thu, Apr 28, 2016 at 8:22 PM, <jww...@mozilla.com> wrote:
>
> > Jim Blandy於 2016年4月28日星期四 UTC+8下午1時51分15秒寫道:
> > > I don't really think it's a good example. TakeMediaIfKnown is
> accepting a
> > > UniquePtr<MediaFile> as an inout parameter: it uses, and may modify,
> its
> > > value. It should take UniquePtr<MediaFile> &.
> > IIUC, UniquePtr<T> can't be an inout parameter for its unique semantics
> > which owns sole ownership of an object. The caller won't be able to use
> the
> > object in a meaningful way after the function returns.
> >
> >
> >
> I'm not sure I understand. Maybe it would help if we had a more concrete
> example to talk about:
>
> $ cat unique-inout.cc
> #include <stdio.h>
> #include "mozilla/UniquePtr.h"
>
> using mozilla::UniquePtr;
>
> struct MediaFile {
>   const char *name;
>   MediaFile(const char *name) : name(name) { printf("constructing %s\n",
> name); }
>   ~MediaFile() { printf("destructing %s\n", name); }
> };
>
> int foo(UniquePtr<MediaFile> &arg, bool pleaseSwap)
> {
>   if (pleaseSwap) {
>     UniquePtr<MediaFile> ptr = Move(arg);
>     arg = UniquePtr<MediaFile>(new MediaFile("foo's"));
>   }
> }
>
> int main(int argc, char **argv) {
>   UniquePtr<MediaFile> first(new MediaFile("first"));
>   printf("before first call\n");
>   foo(first, false);
>   printf("after first call\n");
>
>   UniquePtr<MediaFile> second(new MediaFile("second"));
>   printf("before second call\n");
>   foo(second, true);
>   printf("after second call\n");
>
> }
> $ ln -sf /home/jimb/moz/dbg/mfbt mozilla
> $ g++ -std=c++11 -I . unique-inout.cc -o unique-inout
> $ ./unique-inout
> constructing first
> before first call
> after first call
> constructing second
> before second call
> constructing foo's
> destructing second
> after second call
> destructing foo's
> destructing first
> $
>
> The first MediaFile's destructor doesn't run until the end of main. The
> second MediaFile's destructor runs during the second call to foo, and then
> foo's MedialFile's destructor runs at the end of main.
>
> That's what I meant by a function taking a UniquePtr as an inout parameter.
> It seemed to me like the function Gerald imagined should be written as in
> my code above, rather than passing Move(...) as the argument. Although the
> language doesn't enforce it, I think Move should be reserved for
> unconditional transfers of ownership.
> _______________________________________________
> dev-platform mailing list
> dev-platform@lists.mozilla.org
> https://lists.mozilla.org/listinfo/dev-platform
>
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to