代码之家  ›  专栏  ›  技术社区  ›  crudeyDrawn

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

  •  7
  • crudeyDrawn  · 技术社区  · 7 年前

    我有一段代码,使用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”:无法访问类“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的复制赋值操作符以及复制和移动构造函数(但不是移动赋值操作符)可以在类定义、内联和默认之外定义,代码将编译。

    我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  4
  •   StoryTeller - Unslander Monica    7 年前

    我做错了什么?

    没有什么

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

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