我试图理解移动不是以下代码中的首选。它只适用于琐碎的构造函数吗?没有副作用怎么测试呢?
代码:
#include <iostream>
using namespace std;
struct A {
A() {cout << "A default constructor called." << endl;}
A(const A &a);
A(A &&a) {cout << "A move constructor called." << endl;}
~A() {cout << "A destructor called." << endl;}
};
// making sure inlining isn't the problem.
A::A(const A &a) {cout << "A copy constructor called." << endl;}
struct B {
A a_;
B(A a) : a_{a} {}
};
int main() {
cout << "Testing copy elision when passing by value through B constructor." << endl;
B b = A();
return 0;
}
这是输出。即使正文不使用参数,链式复制省略也不会通过构造函数初始值设定项吗?
Testing copy elision when passing by value through B constructor.
A default constructor called.
A copy constructor called.
A destructor called.
A destructor called.
答案 0 :(得分:2)
来自“C ++编程语言(第四版)”,在移动中:
“在少数情况下,例如对于返回值,语言规则说它可以(因为下一个动作被定义为销毁元素)。但是,通常我们必须通过给出右值引用来告诉它参数”。
在这种情况下,您必须指定移动:
B(A a) : a_{std::move(a)} {}