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