我最近一直在研究右值引用并得出一个结论,即在将制作对象的完整副本的任何地方都使用按值传递是非常有利的(有关完整的理由,请参见例如如何在添加右值引用运算符时减少冗余代码重载?和想要速度?按值传递!),因为编译器可以在诸如f(std::move(a));
, where f
is defined as的情况下自动优化一个副本void f(A a);
。
pass-by-value-everywhere 的一个负面后果是,std::move
即使在简单的情况下,所有代码也会变得乱七八糟,例如:
void Object::value(A a)
{
value_ = std::move(a);
}
显然,如果我只写以下内容:
void Object::value(A a)
{
value_ = a;
}
即使没有提示也不应该用额外的副本惩罚我,编译器应该不难识别它a
接近其生命周期的尽头。事实上,即使在复杂的函数中,编译器也应该能够识别这一点。
问题:
C++0x 标准是否允许这种优化?
编译器是否使用它?即使在复杂的情况下,即功能由不止一行组成?
这种优化有多可靠,即我可以期望编译器像我期望编译器应用返回值优化一样多地利用它吗?