想象一下:
S f(S a) {
return a;
}
为什么不允许给
a
和返回值赋别名?S s = f(t);
S s = t; // can't generally transform it to this :(
规范不允许这种转换,如果
S
的复制构造函数具有副作用。相反,它需要至少两个副本(从 t
到 a
一个,从 a
到返回值另一个,还有一个从返回值到 s
,只有最后一个可以省略。请注意,我在上面写了 = t
来表示将 t
复制到 f 的 a
,在移动/复制构造函数具有副作用的情况下,该复制是唯一仍然必须的复制)。为什么?
S f(S s) { for(E &e : s) e.toupper(); return s; }
编译器可以执行NRVO,并忽略return s
,因为返回值已经就位。这样可以少进行一次复制/移动操作! - Johannes Schaub - litb