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;
}
(example 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.
So, to be sure that a object would not be copied, we usually write something like
SomeBigObject obj;
func(&obj);
whereas in most cases a one-liner like
SomeBigObject obj = func();
would suffice.
Is there any language/compiler facility to help us guarantee that at compile time (maybe some kind of static_assert()) so that we can be confident writing those one-liners ?
I know that marking the copy constructor deleted would do the good, but copy is needed in some cases.