移动构造函数可以接受类本身以外的参数吗?

时间:2017-04-18 20:03:25

标签: c++ visual-studio c++11 move-semantics move-constructor

基本上,移动构造函数的参数是类本身。

但是,如果我想从一个没有复制操作的左值构造一个类的对象,我可以这样做吗?

class A{
   A(const LargeDataType& inData):data(inData) {} // constructor 1
   A(LargeDataType&& inData):data(std::move(inData)) {} // constructor 2
   private:
        LargeDataType data;
};

使用它:

方法1:

LargeDataType outData = 100;
A objA(std::move(outData)); // call constructor 2

方法2(如果没有实现构造函数2):

LargeDataType outData = 100;
A objA(std::move(outData)); // call constructor 1

这样,构造objA时没有复制操作。我的问题是:

  1. 创建像这样的移动构造函数是否合法?

  2. 这比传统的构造函数更有效,因为在创建objA期间不需要复制吗?

  3. 方法2是否可以更好,效率与方法1相同?

  4. 非常感谢!

1 个答案:

答案 0 :(得分:1)

你拥有的不是移动构造函数。它只是一个构造函数,它将rvalue引用作为参数。它们是完美的构造函数,但它们不是移动构造函数。

来自C ++ 11标准(12.8 / 3):

  

X的非模板构造函数是移动构造函数,如果其第一个参数类型为X&&const X&&volatile X&&const volatile X&& ,并且没有其他参数,或者所有其他参数都有默认参数(8.3.6)。

只有

A(A&& a) { ... }
A(const A&& a) { ... }
A(volatile A&& a) { ... }
A(volatile const A&& a) { ... }

可能被称为移动构造函数。

如果除了上述参数之外还有默认值的参数,它们也有资格作为移动构造函数。 E.g。

A(A&& a, T arg = {}) { ... }