避免在拷贝构造函数中实现复制之外的功能
8.18 ID_sideEffectCopyConstructor
拷贝构造函数的执行在某些情况下可被省略,其执行次数可能与预期不符,复制之外的功能也可能无法生效。
示例:
class A {
int i;
static int s;
public:
A();
A(const A& rhs) {
i = rhs.i; // Compliant
s++; // Non-compliant
}
};
例中拷贝构造函数对静态成员有所读写,这种复制之外的功能是不符合要求的。
如果按下列方式使用相关类:
A foo();
int main() {
A a = foo(); // Copy elision
....
}
用相同类型的临时对象构造对象 a,标准允许编译器将临时对象直接当作对象 a,省略拷贝构造函数的执行从而提高效率,这种优化称为“copy elision”,复制之外的功能会因此无法生效。在 C++17 之前,是否执行这种优化由实现定义,C++17 规定在某些情况下必须执行这种优化,具体可参见“guaranteed copy elision”。
相关
依据
ISO/IEC 14882:2003 12.8(15)-implementation
ISO/IEC 14882:2011 12.8(31)-implementation
ISO/IEC 14882:2017 15.8.3(1)-implementation
参考
MISRA C++ 2008 12-8-1