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... not expected...?
}
int main()
{
test(MyClass{});
return 0;
}
对于上面的代码,我希望 test() 中的两个对象创建都调用移动构造函数,因为 b 是右值引用类型 (MyClass&&)。
但是,将 b 传递给 MyClasss 构造函数不会按预期调用移动构造函数,而是调用复制构造函数。
为什么第二种情况会调用复制构造函数,即使传递的参数是 MyClass&& 类型(右值引用)???
我正在使用 gcc 5.2.1。要重现我的结果,您必须将 -fno-elide-constructors 选项传递给 gcc 以禁用复制省略优化。
void test(MyClass&& temp)
{
if (std::is_rvalue_reference<decltype(temp)>::value)
std::cout << "temp is rvalue reference!!\n";
else
std::cout << "temp is NOT rvalue!!\n";
}
即使指定了 temp,上面的代码也会打印出“temp 是右值引用”。
temp 的类型是右值引用类型。
void test(MyClass&& temp)
{
MyClass a(MyClass{}); // calls MOVE constructor as expected
MyClass b(temp); // calls COPY constructor... not expected...?
}
那是因为,temp
(因为它有一个名字,)是一个lvalue
参考一个rvalue
。视为rvalue
随时致电std::move
void test(MyClass&& temp)
{
MyClass a(MyClass{}); // calls MOVE constructor as expected
MyClass b(std::move(temp)); // calls MOVE constructor... :-)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)