又一个关于“为什么必须使用std :: move防止(未命名的)返回值优化?”的问题:
为什么std :: move会防止RVO?解释了标准明确要求函数声明的返回类型必须与
为什么RVO的规则不针对函数的返回类型为
我也知道在编译器中实现这样的功能并不是免费的。我建议只允许这样的例外,但不强制执行。
我也知道
(旁注:为什么
return
语句中表达式的类型相匹配。这解释了符合规范的编译器的行为;但是,它并不能解释限制的原理。为什么RVO的规则不针对函数的返回类型为
T
且return
表达式的类型为T&&
的情况做出异常?我也知道在编译器中实现这样的功能并不是免费的。我建议只允许这样的例外,但不强制执行。
我也知道
return std::move(...)
是不必要的,因为自C++11以来当无法应用RVO时已经需要使用移动语义。尽管如此,为什么不容忍显式请求进行优化而将其转换为悲观结果?
(旁注:为什么
return-value-optimization
和rvo
标签不是同义词?)
return x.y;
,其中x
是一个局部变量,则将是一个没有std::move
(或不同的rvalue转换)的副本。 - Arne Vogel