我有一个关于C++中的移动语义的问题,请看下面的例子:
class Buck {
public:
Buck(std::vector<int> param) : data{param} {}
std::vector<int> data;
};
int main() {
std::vector<int> A{1,2,3,4,5};
Buck b{std::move(A)};
std::cout << A.size() << std::endl;
return 0;
}
它输出0,这意味着A
已经被移动到b
的data
变量中。
现在,最大的问题是--为什么这个能起作用?
据我所知,A
被移到了Buck
构造函数的参数param
中(因为我强制它是std::move()
的右值,并且调用std::vector
中的移动构造函数)。param
本身应该是构造函数内的左值。那么,如果param
是一个左值,data{param}
究竟如何调用std::vector
的move构造函数呢?
1条答案
按热度按时间pdsfdshx1#
将
A
移动到param
中,然后将param
复制到data
中。可以使用以下命令对此进行测试:如果你想移动,你总是需要显式地强制转换为
rvalue
(例如,通过std::move
):一个二个一个一个
如果希望对数据成员执行一次移动,可以在构造函数中获取一个引用:
**注意:**在成员初始化中仍然需要显式
rvalue
-cast!如果不使用它,则会复制一个副本:std::move(a)
与static_cast<Data&&>(a)
相同。当您使用Data&&
类型的变量时,它将被视为Data&
,直到您在表达式中显式地将其转换为Data&&
。将变量声明为Data&&
只对如何初始化它很重要,而对如何使用它不重要!如果希望对复制和移动提供易于实现的支持,那么按值调用是有用的:
如果你想要最大的性能,你可以通过实现复制和移动构造函数来避免第二次移动: