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