移动构造函数可以接受 class 本身以外的参数吗?
Can move constructor take arguments other than the class itself?
基本上,移动构造函数的参数是 class 本身。
但是,如果我想从左值构造一个 class 的对象而不进行复制操作,我可以这样做吗?
class A{
A(const LargeDataType& inData):data(inData) {} // constructor 1
A(LargeDataType&& inData):data(std::move(inData)) {} // constructor 2
private:
LargeDataType data;
};
要使用它:
方法一:
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时就没有复制操作了。我的问题是:
这样创建移动构造函数合法吗?
这比传统的构造函数更有效,因为在创建 objA 时不需要复制?
方法2是否可以比方法1更好并具有相同的效率?
非常感谢!
您拥有的不是移动构造函数。它只是一个将右值引用作为参数的构造函数。它们是非常好的构造函数,但它们不是移动构造函数。
来自 C++11 标准 (12.8/3):
A non-template constructor for class X
is a move constructor if its first parameter is of type X&&
, const X&&
, volatile X&&
, or const volatile X&&
, and either there are no other parameters or else all other parameters have default arguments (8.3.6).
只有
A(A&& a) { ... }
A(const A&& a) { ... }
A(volatile A&& a) { ... }
A(volatile const A&& a) { ... }
可能被称为移动构造函数。
如果除了上述参数之外还有带默认值的参数,它们也可以作为移动构造函数。例如
A(A&& a, T arg = {}) { ... }
基本上,移动构造函数的参数是 class 本身。
但是,如果我想从左值构造一个 class 的对象而不进行复制操作,我可以这样做吗?
class A{
A(const LargeDataType& inData):data(inData) {} // constructor 1
A(LargeDataType&& inData):data(std::move(inData)) {} // constructor 2
private:
LargeDataType data;
};
要使用它:
方法一:
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时就没有复制操作了。我的问题是:
这样创建移动构造函数合法吗?
这比传统的构造函数更有效,因为在创建 objA 时不需要复制?
方法2是否可以比方法1更好并具有相同的效率?
非常感谢!
您拥有的不是移动构造函数。它只是一个将右值引用作为参数的构造函数。它们是非常好的构造函数,但它们不是移动构造函数。
来自 C++11 标准 (12.8/3):
A non-template constructor for class
X
is a move constructor if its first parameter is of typeX&&
,const X&&
,volatile X&&
, orconst volatile X&&
, and either there are no other parameters or else all other parameters have default arguments (8.3.6).
只有
A(A&& a) { ... }
A(const A&& a) { ... }
A(volatile A&& a) { ... }
A(volatile const A&& a) { ... }
可能被称为移动构造函数。
如果除了上述参数之外还有带默认值的参数,它们也可以作为移动构造函数。例如
A(A&& a, T arg = {}) { ... }