代码之家  ›  专栏  ›  技术社区  ›  Nick

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

  •  1
  • Nick  · 技术社区  · 9 年前

    由于重复的高风险,

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

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

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

    注:

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

    问题是为什么决定这些方法是自动生成的 d-tor 添加。

    我可以发布一些由于生成这些方法而导致代码损坏的示例,例如:

    class FileDescriptorGuard{
        int fd;
        
    public:
        FileDescriptorGuard(int const fd) : fd(fd){}
        
        ~FileDescriptorGuard(){
            ::close(fd);
        }
    };
    

    当复制或移动对象时,会发生灾难。

    1 回复  |  直到 5 年前
        1
  •  3
  •   Nick    9 年前

    在谢尔盖·祖布科夫(Sergey Zubkov)的帮助下,我做了一些研究后,《卫报》似乎给出了部分答案。

    在里面 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 ,没有这样的警告。