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++ 错误。如果可以,请尝试更新到更高版本。
我有一段代码使用 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++ 错误。如果可以,请尝试更新到更高版本。