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

c++ default move assignment cannot access protected base member

我有一段代码使用 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': cannot access protected member declared in class '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;
};

同样有趣的是,这只发生在移动赋值运算符上。 B 的复制赋值运算符以及复制和移动构造函数(但不是移动赋值运算符)可以在 class 定义、内联和默认值之外定义,代码将编译.

我做错了什么?

What am I doing wrong?

没有。

显式默认定义与编译器生成的定义完全相同。在这种情况下,它将移动分配所有基地和成员。当然,这要求那些基和成员的移动赋值运算符可以被您默认的对象访问。由于受到保护,您的可以访问。

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