在下面的(借来的)示例中,在我的环境中从未调用移动构造函数:
#include <iostream>
class MyClass {
public:
MyClass()
{
std::cout << "default constructor\n";
}
MyClass(MyClass& a)
{
std::cout << "copy constructor\n";
}
MyClass(MyClass&& b)
{
std::cout << "move constructor\n";
}
};
void test(MyClass&& temp)
{
MyClass a(MyClass{}); // calls MOVE constructor as expected
MyClass b(temp); // calls COPY constructor...
}
int main()
{
test(MyClass{});
return 0;
}我的输出是:默认构造函数默认复制构造函数
我使用的是XCode版本9.1,是不是应该在rvalue引用上调用移动构造函数?我在这里错过了什么?
约翰。
发布于 2017-11-27 20:56:41
我在这里错过了什么?
问题是,所有有名字的东西都是lvalue。
这意味着命名的rvalue引用本身是lvalue,temp来自:
void test(MyClass&& temp)也是不值钱的。因此,不调用move构造函数。
如果要调用移动构造函数,请使用std::move
void test(MyClass&& temp)
{
// ...
MyClass b(std::move(temp)); // use std::move here
}顺便说一下,
MyClass(MyClass& a)
{
std::cout << "copy constructor\n";
}不是复制构造函数,因为复制构造函数的形式为:
MyClass(const MyClass& a) { ... }https://stackoverflow.com/questions/47519641
复制相似问题