2014-10-08 151 views
5

是否有任何编译器标志强制执行下一个规则?如何在存在用户定义的析构函数时禁用隐式定义的复制构造函数生成

如果T具有用户定义的析构函数或用户定义的复制赋值运算符,则不建议使用隐式定义的复制构造函数的生成。

的隐式定义的拷贝赋值运算符的生成是 弃用(因为C++ 11)如果T具有用户声明的析构函数或 用户声明的复制构造。

我有兴趣在Clang,Visual Studio 2013或GCC中强制执行任何规则,因为代码库将与它们一起编译。

+0

你可以只从'noncopyable'继承:HTTP://www.boost.org/doc/libs/1_55_0/libs/utility/utility.htm#Class_noncopyable – EdChum 2014-10-08 09:37:14

+0

为VS,你可以激活“的警告,原样错误“ – 2014-10-08 09:39:20

+0

@MarcoA。这是一个警告吗?在哪个版本和什么警告级别? – Felics 2014-10-08 09:39:52

回答

5

bug report提到不发射在海湾合作委员会警告这个测试用例:

struct W { 
    int a; 
    ~W() { a = 9; } 
}; 

int main() { 
W w {}; 
W v = w; 
} 

参考乔纳森Wakely的评论:

这是不正确,编译器可以(不)警告法定代码。

我确认这一点,我们会希望在某些时候的警告,它 将使我们能够提高-Weffc++警告这一部分:

*项目11:定义一个拷贝构造函数和赋值运算符用于动态分配内存的类。

(见PR 16166 了解详细信息)

也许我们可以把这种警告-Wdeprecated-special-members和 有它启用-Weffc++和C++ 11也-Wdeprecated

锵已经警告说,这个与-Wdeprecated

main.cpp:3:3: warning: definition of implicit copy constructor for 'W' is deprecated because it has a user-declared destructor [-Wdeprecated] 

    ~W() { a = 9; } 

^

main.cpp:8:8: note: implicit copy constructor for 'W' first required here 

W v = w; 

Microsoft明确指出,Visual Studio将不会发出在这种情况下警告:

此外,C++ 11标准规定了以下附加 规则:

  • 如果一个拷贝构造函数和析构函数是显式声明,那么不赞成使用复制赋值操作符的自动生成。

  • 如果明确声明了复制赋值运算符或析构函数,则不建议自动生成复制构造函数。

在这两种情况下,Visual Studio将继续隐含自动生成 必要的功能,并且不会发出警告。

+1

-Wdeprecated对我来说已经足够了。我已经有警告作为错误:) – Felics 2014-10-08 09:41:53

相关问题