如果存在析构函数,为什么会生成复制构造函数

时间:2016-04-22 17:20:55

标签: c++ c++11 language-lawyer

重复的风险很高,

在C ++中,如果你有自定义析构函数,你可能需要编写自己的复制构造函数和复制赋值运算符。

在C ++ 11中,您可能还需要移动构造函数并移动赋值运算符。

如果存在自定义析构函数,为什么编译器会自动生成所有这些方法?

注意:

问题不会询问自动生成所有这些方法的条件是什么。

问题是为什么决定添加自动生成的方法,甚至IF ( OBJECT_ID('tempdb..#tmp') IS NOT NULL ) DROP TABLE #tmp; CREATE TABLE #tmp ( [Date] DATETIME ,[Revenue] DECIMAL(18, 2) ); -- DECLARE @first INT = 0 ,@last INT = 200; WHILE @first < @last BEGIN INSERT INTO #tmp ( Date, Revenue ) VALUES ( GETDATE() - @first * 0.5, RAND() * 100000 ); SET @first = @first + 1; END;

由于生成了这些方法,我可以发布几个破坏代码的例子,例如:

d-tor

此处复制或移动对象时会发生灾难。

1 个答案:

答案 0 :(得分:3)

在我从谢尔盖祖布科夫的帮助下做了一些研究后,似乎&#34; Praetorian&#34;给出部分答案。

C++11中,生成copy c-tors是为了向后兼容。

Move c-tors未生成,因为这是C++11中引入的功能。

但是,如果您将clang-Wdeprecated一起使用,则会发出警告。这是一个示例程序:

class FileDescriptorGuard;

int main(){
    FileDescriptorGuard x(5);
    FileDescriptorGuard y = x;
}

这是编译器输出:

$ clang -Wdeprecated -std=c++11  x.cc -lstdc++ 
x.cc:9:5: warning: definition of implicit copy constructor for 'FileDescriptorGuard' is deprecated because it has a user-declared
      destructor [-Wdeprecated]
    ~FileDescriptorGuard(){
    ^
x.cc:16:26: note: implicit copy constructor for 'FileDescriptorGuard' first required here
        FileDescriptorGuard y = x;
                                ^
1 warning generated.

如果您使用gcc,则没有此类警告。