【问题标题】:destructor and unique_ptr析构函数和 unique_ptr
【发布时间】:2013-03-07 07:45:09
【问题描述】:

我有以下代码

class A {
    public:
        A(){}
        ~A(){}
    private:
        std::vector<std::unique_ptr<double> > x;
};

A f() {
    A a;
    return a;
}

int main() {
    A a=f();
    return 0;
}

除非我注释掉析构函数,否则它不会编译(gcc 4.7)。实际上,我的代码中并不需要这个析构函数,我只是想将它用于调试目的。

但是,我不明白发生了什么,因此我担心我做错了什么。这里发生了什么?

【问题讨论】:

  • 当询问为什么某些东西无法编译时,包含错误消息总是有帮助的。
  • @user2183861 不,那里没有回答。问题完全不同

标签: c++ c++11 unique-ptr


【解决方案1】:

这是因为显式定义的析构函数的存在阻止了为A 隐式生成移动构造函数。

根据 C++11 标准的第 12.8/9 段:

如果类 X 的定义没有显式声明移动构造函数,则会隐式声明 默认当且仅当

— X 没有用户声明的复制构造函数,

——X 没有用户声明的复制赋值运算符,

— X 没有用户声明的移动赋值运算符,

——X 没有用户声明的析构函数,并且

——移动构造函数不会被隐式定义为已删除。

现在没有移动构造函数,要从f() 返回值,编译器将尝试调用隐式生成的复制构造函数(为了向后兼容仍在生成该构造函数)。但是,std::unique_ptr 是不可复制的。因此,错误。

显式定义移动构造函数(或将其声明为默认构造函数,如 cmets 中的 juanchopanza 所建议)将解决问题。

【讨论】:

  • @AndyProwl 此评论与答案无关,请问您从哪里获得 C++ 11 标准,是在书上吗?谢谢!
  • 好吧,您还应该添加 A&amp;operator=(A&amp;&amp;) 以提供移动分配。
  • @SongWang:您可以从here 下载最新草案,但请记住,这比当前的官方标准(您可以从 ISO 购买)更新
  • @ipc:实际上,不明确定义析构函数是 IMO 最有意义的。但是是的,如果一个人不想遵循零法则,他至少应该遵循五法则。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-08-28
  • 2014-10-25
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
相关资源
最近更新 更多