According to some sources, Named Return Value Optimization (NRVO) is performed when a return object;
statement in a function is executed.
Nevertheless, the execution of
<code>int foo(int a_func) {
std::cout << "Address of a_func: " << &a_func << std::endl;
return a_func;
}
int main(int argc, char **argv) {
int a = 10;
std::cout << "Address of a: " << &a << std::endl;
int &&a_func_return{foo(a)};
std::cout << "Address of a_func_return: " << &a_func_return << std::endl;
return 0;
}
</code>
<code>int foo(int a_func) {
std::cout << "Address of a_func: " << &a_func << std::endl;
return a_func;
}
int main(int argc, char **argv) {
int a = 10;
std::cout << "Address of a: " << &a << std::endl;
int &&a_func_return{foo(a)};
std::cout << "Address of a_func_return: " << &a_func_return << std::endl;
return 0;
}
</code>
int foo(int a_func) {
std::cout << "Address of a_func: " << &a_func << std::endl;
return a_func;
}
int main(int argc, char **argv) {
int a = 10;
std::cout << "Address of a: " << &a << std::endl;
int &&a_func_return{foo(a)};
std::cout << "Address of a_func_return: " << &a_func_return << std::endl;
return 0;
}
lead to
<code>Address of a: 0x796ca0209020
Address of a_func: 0x796ca0209060
Address of a_func_return: 0x796ca0209030
</code>
<code>Address of a: 0x796ca0209020
Address of a_func: 0x796ca0209060
Address of a_func_return: 0x796ca0209030
</code>
Address of a: 0x796ca0209020
Address of a_func: 0x796ca0209060
Address of a_func_return: 0x796ca0209030
If there was any copy elision, shouldn’t the addresses of a_func
and a_func_return
be the same?