On Tue, 15 Nov 2022, 05:48 Yubin Ruan via Gcc-help, wrote: > Hi, > > As mentioned in cppreference: > https://en.cppreference.com/w/cpp/language/copy_elision > > it is guaranteed in c++17 that copy elision must be applied for some cases > like > > SomeBigObject SomeBigObject::Factory(...) { > SomeBigObject local; > ... > return local; > } > No, this is not guaranteed. As the cppreference page explains, it's only guaranteed for copying temporaries. This is not a temporary. Elision here is allowed, but not required. It's commonly implemented though. > (examples taken from https://abseil.io/tips/11 ) > > but not for cases like > > SomeBigObject SomeBigObject::Factory(...) { > SomeBigObject local1; > SomeBigObject local2; > ... > > if (cond_1) { > return local1; > } else { > return local2; > } > } > > For a c++ user, it is somewhat difficult to be 100% sure that copy elision > / NVO is applied to the functions' return value above. > > To be sure that a object would not be copied, we usually write something > like > > SomeBigObject obj; > func(&obj); > > while in most of the cases a one-liner like > > SomeBigObject obj = func(); > > would suffice. > > Is there any language facility to help us guarantee that at compile time > (such as some kind of static_assert() ) so that we can be confident writing > those one-liner ? > Make it cheap to move, and then it will be moved instead of copied. The move isn't always elided, but if it's cheap then the code will still be efficient. > I know that marking the copy constructor deleted would do the good, but > copy is needed in some cases. > > Thanks > Yubin >