☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免在拷贝构造函数中实现复制之外的功能

8.18 ID_sideEffectCopyConstructor
目录 › next › previous

拷贝构造函数的执行在某些情况下可被省略,其执行次数可能与预期不符,复制之外的功能也可能无法生效。

示例:

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”。

相关

ID_sideEffectMoveConstructor

依据

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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.