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; } (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 ? I know that marking the copy constructor deleted would do the good, but copy is needed in some cases. Thanks Yubin