我写了这个:
#include <iostream>
struct A
{
int a;
int b;
A() : a(10) { std::cout << "default ctor" << std::endl;}
~A(){ }
A(const A&){ std::cout << "copy ctor" << std::endl; }
A(const A&&){ std::cout << "move ctor" << std::endl; }
};
A init()
{
A a;
a.b = 20;
return a;
}
int main()
{
A a = init();
std::cout << a.b << std::endl;
}
我预计A a = init()
强制执行move-contructor调用,但outpur是:
default ctor
20
答案 0 :(得分:1)
该行
A a = init();
由NRVO
内联。它通过在其代码段中使用它的默认构造函数来创建对象:
A a;
此处不会使用您的移动构造函数。
此处的移动构造函数可以与-fno-elide-constructors
编译器标志一起使用。我用modified your example用这个标志编译它。但请注意,将始终调用默认构造函数,因为NRVO
不会影响您的代码。 NRVO
仅表示对象将在需要的存储中构建(而不是在init
方法的堆栈上),因此不会移动或复制它。使用no-elide标志,它不能在那里创建,因此它将被复制/移动到那里。