【发布时间】:2017-03-04 12:32:17
【问题描述】:
我有一个带有明确删除的复制构造函数的类,比如说NonCopyable。然后有一个类Base1,其成员类型为NonCopyable。另一个类Base2 以Base1 为父类。最后 - 一个 Derivative 类,其父级是 Base2。
由于NonCopyable 是不可复制的,很明显Base1、Base2 和Derivative 也是不可复制的。但似乎也删除了移动构造函数(和赋值运算符)。
在这里测试一下:
以下行给出了这些错误:Derived d1, d2 = std::move(d1);
GCC: 'Derived::Derived(Derived&&)' 被隐式删除,因为默认定义格式不正确: 派生类:
其余错误只是声称Base1和Base2复制 ctor 被隐式删除,这并不奇怪MSVC: 错误 C2280: 'Derived::Derived(const Derived &)': 试图引用已删除的函数
在提供的链接中,也有注释行给出了类似的错误。请取消注释它们以查看我想向您展示的更多错误(例如,remove_if 未注释它抱怨删除的移动 (在 GCC 上) /copy (在 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);
}
【问题讨论】:
-
你能在这里显示代码吗?我对随机链接过敏。此外,如果这个问题被证明是有用的,那么这里的代码更适合搜索,我们不必担心它会从链接的站点中删除。
-
@Someprogrammerdude 我认为
Derived不符合这些标准中的任何一个。但如果你看到我的错误,请告诉我它在哪里。 -
@Criss:一些实验表明
Base和Base2都必须声明它们的移动构造函数,但Derived可以使用默认值。我不知道具体原因。 -
问题可以是seen with
Base1already;其余的都是不必要的并发症。未生成Base1的移动构造函数,因为它具有用户声明的析构函数。
标签: c++ c++11 inheritance move-semantics