C ++通过复制/移动传递值语义

时间:2014-11-10 06:37:28

标签: c++ pass-by-reference

我试图理解移动不是以下代码中的首选。它只适用于琐碎的构造函数吗?没有副作用怎么测试呢?

代码:

#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.

1 个答案:

答案 0 :(得分:2)

来自“C ++编程语言(第四版)”,在移动中:

“在少数情况下,例如对于返回值,语言规则说它可以(因为下一个动作被定义为销毁元素)。但是,通常我们必须通过给出右值引用来告诉它参数”。

在这种情况下,您必须指定移动:

  B(A a) : a_{std::move(a)} {}