On Sat, Nov 19, 2022 at 6:12 PM Jonathan Wakely wrote: > > > 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. > Thank you all. It seems that currently the only way to guarantee efficiency is to use move instead. -- Yubin