我有一段代码用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; };
同样有趣的是,这只发生在move-assignment-operator中. B的复制赋值运算符以及复制和移动构造函数(但不是移动赋值运算符)可以在类定义,内联和默认之外定义,代码将编译.
我究竟做错了什么?