【发布时间】:2018-08-29 01:48:03
【问题描述】:
另一个“为什么std::move 必须阻止(未命名的)返回值优化?”问题:
Why does std::move prevent RVO? 解释说该标准特别要求函数声明的返回类型必须与return 语句中的表达式类型匹配。这解释了符合标准的编译器的行为;但是,它没有解释限制的理由。
为什么RVO的规则对函数返回类型为T且return表达式的类型为T&&的情况不做例外处理?
我也知道在编译器中实现这些东西并不是免费的。我只是建议允许但不是必需的这种例外。
我也知道 return std::move(...) 是不必要的,因为 C++11 already requires that move semantics be used when the RVO can't be applied。然而,为什么不容忍明确的优化请求,而不是将其变成悲观化呢?
(旁白:为什么return-value-optimization 和rvo 标签不是同义词?)
【问题讨论】:
-
“因为 C++11 已经要求在无法应用 RVO 时使用移动语义。” ——这是一种奇怪的说法。我宁愿把它总结为“C++11 已经要求在 RVO 的条件适用但编译器没有实现它时使用移动语义。”;特别是,如果您尝试执行
return x.y;其中x是局部变量,它将是没有std::move的副本(或不同的右值转换)。
标签: c++ c++11 standards rvo return-value-optimization