这是复制省略参考 1:。
编译器可以通过内联创建对象来优化生成临时对象时的复制构造函数调用,并且 C++ 标准明确允许这样做。
这在标准中也通过示例很好地证明了这一点:
C++03 标准 12.2 临时对象 [class.temporary]
第 2 段:
[Example:
class X {
// ...
public:
// ...
X(int);
X(const X&);
˜X();
};
X f(X);
void g()
{
X a(1);
X b = f(X(2));
a = f(a);
}
X(2)
在这里,一个实现可能会在将它传递给f()
使用 X 的复制构造函数之前使用一个临时对象来构造它;或者,X(2)
可以在用于保存论点的空间中构造。此外,在将结果f(X(2))
复制到`b using
X ’s copyconstructor; alternatively,
f() ’s result might be constructed in b. On the other hand, the expression
a=f(a) requires a temporary for either the argument a or the result of
f(a) to avoid undesired aliasing of
a` 之前,可能会使用一个临时值来保存结果。]
参考 1:
C++03 12.8 复制类对象 [class.copy]
第 12 段:
当满足某些条件时,允许实现省略类对象的复制构造,即使对象的复制构造函数和/或析构函数具有副作用......