c++ - 是否将 r 值传递给返回它的函数在 C++ 中被认为是错误的?
问题描述
我想创建一个功能Service
,使疲惫的手机充满活力并按如下方式返回。
写作
Phone p;
p = Service(p);
看起来不优雅所以我想写如下。
Phone& p = Service(Phone());
这样做会产生如下奇怪的输出。
Ctor
Dtor
Destroyed
Energy: 100%
Ending...
预期的输出是:
Ctor
Energy: 100%
Dtor
Destroyed
Ending...
问题
你能告诉我为什么会这样吗?
注意:我是 C++ 新手。
class Phone
{
private:
int energy;
bool destroyed = false;
public:
Phone() : energy{ 0 } {
cout << "Ctor" << endl;
}
~Phone()
{
cout << "Dtor" << endl;
if (destroyed == false)
{
cout << "Destroyed..." << endl;
destroyed = true;
}
}
void Energize() { energy = 100; }
void Status() const
{
cout << "Energy: " << energy << "%" << endl;
}
};
Phone& Service(Phone&& input)
{
input.Energize();
return input;
}
int main()
{
Phone& p = Service(Phone());
p.Status();
cout << "Ending..." << endl;
}
解决方案
退回手机副本是没有意义的。所以只需将它作为参考传递并对其进行操作:
void Service(Phone& phone);
Phone p{};
Service(p);
推荐阅读
- css - 为什么 Google Chrome 浏览器使用 -webkit-* 前缀,而 Chrome 在 Blink 上运行(IOS 除外,它们在 webkit 上运行)
- mule-studio - 如何将此代码从 Dataweave 1 转换为 Dataweave 2
- python - 无法连接到端点 aws
- javascript - 在 ServiceWorker 中使用 setTimeout
- amazon-s3 - 我的 kinesis 数据和 s3 数据不匹配。为什么是这样?
- visual-studio - 使用 VS 和 R# 从 MyGet 调试 PDB
- c++ - 输出操纵器 std::ends 是否将 Null 字符添加到输出缓冲区?
- swift - 将两个变量值分配给标签时删除单词 optional
- python - Python MySQL 将 DateTime 和 Decimal 值转换为可读值
- c# - 如何从 ASP.Net 核心中的 Json 文件中播种 NetTopologySuite.Geometries.Point 数据