gpt4 book ai didi

不为右值引用调用 C++ move 构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:54 24 4
gpt4 key购买 nike

<分区>

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() 中的两个对象创建都调用 move 构造函数,因为 b 是右值引用类型 (MyClass&&)。

但是,将 b 传递给 MyClasss 构造函数并没有像预期的那样调用 move 构造函数,而是调用复制构造函数。

为什么第二种情况调用复制构造函数,即使传递的参数是类型 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 is rvalue reference”。

temp 的类型是右值引用类型。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com