我有一段代码可以编译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
错误消息为
第14行中的C2248'A :: A':无法访问“A”类中声明的受保护成员
,其中定义了移动赋值运算符。有趣的是,以下代码编译得很好:
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的复制赋值运算符以及复制和移动构造函数(但不是移动赋值运算符)可以在类定义,内联和默认之外定义,代码将被编译。
我做错了什么?
答案 0 :(得分:4)
我做错了什么?
没有
明确默认的定义与编译器生成的定义完全相同。在这种情况下,它将移动分配所有基地和成员。当然,这要求那些基地和成员的移动分配操作员可以访问您的默认操作。由于受到保护,您可以访问。
这是一个MSVC ++错误。如果可以,请尝试更新到更高版本。