gpt4 book ai didi

c++ - 了解返回时的右值引用

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:10 24 4
gpt4 key购买 nike

例如我有如下代码

//g++  5.4.0

#include <iostream>

struct data
{
int n;
data()
{
std::cout << "data()\n";
}
data(const data&)
{
std::cout << "data(const data&)\n";
}
data(data&&)
{
std::cout << "data(data&&)\n";
}
};

class container
{
data d;
public:
data getData()
{
return std::move(d);
}
};

int main()
{
container c;
data result = c.getData();
}

输出是:

data() 
data(data&&)

我不明白它是如何工作的。我没有将返回类型声明为 data&&,但移动构造函数可以很好地处理结果。是的,代码是 std::move(d) 但返回类型不是 data&&。那么它是怎样工作的?

最佳答案

此答案更改为 .

data getData()
{
return std::move(d);
}

此方法将 d 移动到其返回值中。

data x = foo.getData();

这一个从getData 的返回值构造x。但是,如果 getData 返回纯右值(匹配的值类型),C++ 标准鼓励并允许省略 这种结构。 Elision是指将返回值的identitylifetimex合并。只有一个对象存在,而不是两个。

这允许跳过副作用,例如移动构造函数中的打印语句。

所以d是被移动的对象,移动直接构造了x

如果您将 getData 更改为返回 data&&,那么现在在 getData 内部没有进行任何移动,但是在构造 时在外部进行了一次移动x.

getData 的返回值从来都不是一个对象,它是一个纯右值,并且纯右值在 中更像是创建对象的指令。实际上省略不再是可选的。

关于c++ - 了解返回时的右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50651017/

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