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

前端之家收集整理的这篇文章主要介绍了c默认移动分配无法访问受保护的基本成员前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一段代码用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的复制赋值运算符以及复制和移动构造函数(但不是移动赋值运算符)可以在类定义,内联和默认之外定义,代码将编译.

我究竟做错了什么?

解决方法

What am I doing wrong?

没有.

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

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

猜你在找的C&C++相关文章