【问题标题】:Implicitly generate move constructor隐式生成移动构造函数
【发布时间】:2012-11-09 22:08:03
【问题描述】:

是否可以隐式生成仅移动类的移动构造函数?考虑这样一个类:

class moveable_only
{
  unique_ptr<int> p_;
};

moveable_only m;
foo(std::move(m));

这不会编译,因为隐式声明的复制构造函数不能复制 p_。 (12.8/7)

如果类定义没有显式声明复制构造函数,则隐式声明。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,它被定义为默认(8.4)。

现在考虑一下:

class moveable_only
{
  unique_ptr<int> p_;
  
   moveable_only(const moveable_only&);
   moveable_only& operator = (const moveable_only&);
};

moveable_only m;
foo(std::move(m));

由于 12.8/9,这也无法编译

如果类 X 的定义没有显式声明移动构造函数,则当且仅当一个移动构造函数将被隐式声明为默认值

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

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

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

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

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

【问题讨论】:

    标签: c++ visual-c++ c++11 visual-studio-2012 move-semantics


    【解决方案1】:

    这不会编译,因为隐式声明的复制构造函数不能复制 p_。 (12.8/7)

    不需要复制构造函数。这不会编译,因为您的编译器似乎不会自动生成移动构造函数,它应该这样做

    除了自己实现或更新编译器之外别无他法。

    【讨论】:

    • 好吧,那么如果我的编译器还不支持这个功能,那我基本上就注定了总是要完全写出移动构造函数和移动赋值运算符?
    • @cooky 我以一种可能的方式编辑以减少代码重复量。
    • 好吧,我真的不明白你用我想要的行为编写可复制的 unique_ptr 是什么意思,我不希望它是可复制的。 ^^
    • 哦,等等。那我似乎误解了你的问题。我更新了答案。
    • @cooky451 :VS11 只是针对标准的较旧草案;它不是一个错误,而是一个尚未实现的功能。详情请见this blog article
    猜你喜欢
    • 2020-09-07
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2016-02-29
    • 1970-01-01
    • 2016-12-16
    • 2016-12-28
    相关资源
    最近更新 更多