在程序中,如下所示
#include <iostream>
struct A
{
A() { std::cout << "0"; }
A( const A & ) { std::cout << "1"; }
A( A && ) noexcept { std::cout << "2"; }
};
A foo()
{
A res;
return res;
}
int main()
{
const A a = foo();
(void)a;
}我期望在foo()中进行命名返回值优化,因此既不会调用copy构造函数,也不会调用移动构造函数。而事实上,gcc和当当印制了“0”。
但调试配置中的Visual Studio 2019会打印“02”。允许编译器在调试版本中避免NRVO吗?
发布于 2021-05-15 01:17:22
由于mandatory copy elision在这里不适用,是的,编译器没有义务在任何构建中优化移动,无论是调试还是优化的构建。
这是允许的,但不是必需的。
https://stackoverflow.com/questions/67538341
复制相似问题