gpt4 book ai didi

c++ - Rvalue 成员确实也是 Rvalues 吗?

转载 作者:行者123 更新时间:2023-11-28 00:25:47 28 4
gpt4 key购买 nike

They say Rvalues 的成员也是 Rvalues - 这很有意义。所以这要么是 VC++ 特有的错误,要么是我对右值理解的错误。

拿这个玩具代码:

#include <vector>
#include <iostream>
using namespace std;

struct MyTypeInner
{
MyTypeInner() {};
~MyTypeInner() { cout << "mt2 dtor" << endl; }
MyTypeInner(const MyTypeInner& other) { cout << "mt2 copy ctor" << endl; }
MyTypeInner(MyTypeInner&& other) { cout << "mt2 move ctor" << endl; }
const MyTypeInner& operator = (const MyTypeInner& other)
{
cout << "mt2 copy =" << endl; return *this;
}
const MyTypeInner& operator = (MyTypeInner&& other)
{
cout << "mt2 move =" << endl; return *this;
}
};

struct MyTypeOuter
{
MyTypeInner mt2;

MyTypeOuter() {};
~MyTypeOuter() { cout << "mt1 dtor" << endl; }
MyTypeOuter(const MyTypeOuter& other) { cout << "mt1 copy ctor" << endl; mt2 = other.mt2; }
MyTypeOuter(MyTypeOuter&& other) { cout << "mt1 move ctor" << endl; mt2 = other.mt2; }
const MyTypeOuter& operator = (const MyTypeOuter& other)
{
cout << "mt1 copy =" << endl; mt2 = other.mt2; return *this;
}
const MyTypeOuter& operator = (MyTypeOuter&& other)
{
cout << "mt1 move =" << endl; mt2 = other.mt2; return *this;
}
};

MyTypeOuter func() { MyTypeOuter mt; return mt; }

int _tmain()
{
MyTypeOuter mt = func();
return 0;
}

这段代码输出:

mt1 move ctor

mt2 copy =

mt1 dtor

mt2 dtor

也就是说,MyTypeOuter 的移动构造函数调用 MyTypeInner 的复制,而不是移动。如果我将代码修改为:

MyTypeOuter(MyTypeOuter&& other)       
{ cout << "mt1 move ctor" << endl; mt2 = std::move(other.mt2); }

输出符合预期:

mt1 move ctor

mt2 move =

mt1 dtor

mt2 dtor

似乎 VC++(2010 和 2013)不遵守标准的这一部分。还是我遗漏了什么?

最佳答案

rvalue 的成员是否是 rvalue 不是这里的问题,因为您正在处理赋值运算符中的左值。

在这个移动赋值运算符中,

const MyTypeOuter& operator = (MyTypeOuter&& other)
{
cout << "mt1 move =" << endl;
mt2 = other.mt2;
return *this;
}

other 是一个 lvalue(因为它有一个名称),并且通过扩展也是 other.mt2。当您说 mt2 = other.mt2 时,您只能调用标准赋值运算符。

为了调用移动构造函数,您需要使 other.mt2 看起来 像一个右值,这就是 std::move实现:

const MyTypeOuter& operator = (MyTypeOuter&& other)
{
cout << "mt1 move =" << endl;
mt2 = std::move(other.mt2);
return *this;
}

参见 this related question .

关于c++ - Rvalue 成员确实也是 Rvalues 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25153387/

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