c ++默认移动分配无法访问受保护的基础成员

时间:2018-05-03 08:28:10

标签: c++ visual-studio-2015

我有一段代码可以编译msvc并启用了语言扩展,但禁用了语言扩展。它分解为这个最小的例子:

class A
{
    protected:
    A(const A&);
    A& operator=(const A&);
    A(A&&);
    A& operator=(A&&);
};
class B : public A
{
    public:
    B& operator=(B&&);
};
inline B& B::operator=(B&&) = default; // error C2248

错误消息为

  

C2248'A :: A':无法访问“A”类中声明的受保护成员

第14行中的

,其中定义了移动赋值运算符。有趣的是,以下代码编译得很好:

class A
{
    protected:
    A(const A&);
    A& operator=(const A&);
    A(A&&);
    A& operator=(A&&);
};
class B : public A
{
    public:
    B& operator=(B&&) = default;
};

另外有趣的是,这只发生在move-assignment-operator中。 B的复制赋值运算符以及复制和移动构造函数(但不是移动赋值运算符)可以在类定义,内联和默认之外定义,代码将被编译。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

  

我做错了什么?

没有

明确默认的定义与编译器生成的定义完全相同。在这种情况下,它将移动分配所有基地和成员。当然,这要求那些基地和成员的移动分配操作员可以访问您的默认操作。由于受到保护,您可以访问。

这是一个MSVC ++错误。如果可以,请尝试更新到更高版本。