不合理地删除了移动构造函数

Cri*_*iss 1 c++ inheritance move-semantics c++11

我有一个名为explicitely删除的复制构造函数的类,比方说,NonCopyable.然后是一个类型Base1成员的类NonCopyable.而另一类Base2Base1父.最后 - Derivative父母是一个阶级Base2.

由于NonCopyable是不可复制的,因此很明显Base1,Base2并且Derivative也是不可复制的.但似乎还有移动构造函数(和赋值运算符)已删除.

在这里测试一下:

以下行给出了这些错误:
Derived d1, d2 = std::move(d1);

GCC: 'Derived :: Derived(Derived &&)'被隐式删除,因为默认定义是不正确的:class Derived:
其余的错误只是声称Base1Base2复制ctors被隐式删除,这并不奇怪

MSVC:错误C2280:'Derived :: Derived(const Derived&)':尝试引用已删除的函数

在提供的链接中,还有注释行,它们给出了类似的错误.请取消注释以查看我想向您展示的更多错误(例如,未remove_if注释它会抱怨删除移动(在GCC上) /复制(在MSVC上)分配操作员).
我想要实现的是使Derivative(及其基础)可移动,但不可复制.

我正在使用Visual Studio 2015并获得与我提供的msvc链接完全相同的错误,但我不确定在rextester.com上使用什么版本的MSVC进行编译.

我也是应@Richard Critten的要求粘贴代码的:

    class NonCopyable
    {
    public:
       NonCopyable() { }
       NonCopyable(const NonCopyable &) = delete;
       NonCopyable & operator=(const NonCopyable &) = delete;
       NonCopyable(NonCopyable &&) { }
       NonCopyable & operator=(NonCopyable &&) { return *this; }
    };

     class Base1
     {
     public:
          virtual ~Base1() = default;

     private:
          NonCopyable m;
     };

     class Base2 :
        public Base1
     {
     public:
          virtual ~Base2() = default;
     };

     class Derived :
        public Base2
     {
     };



int main()
{
    std::vector<Derived> v;
    //std::remove_if(v.begin(), v.end(), [](const Derived &) { return true; });
    //v.emplace_back();
    Derived d1, d2 = std::move(d1);
}
Run Code Online (Sandbox Code Playgroud)

Igo*_*nik 7

[class.copy]/9如果类的定义X没有显式声明一个移动构造函数,当且仅当一个类的定义被隐式声明为默认值时

(9.4) - X没有用户声明的析构函数.

Base1有一个用户声明的析构函数,所以没有移动构造函数.由于不可复制的成员,复制构造函数被隐式声明为已删除.所以Base1既不能复制或移动,当然Base2Derived它在一起.