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':无法访问在类 '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 的复制赋值操作符以及复制和移动构造函数(但不是移动赋值操作符)可以在类定义、内联和默认值之外定义,并且代码将编译。
我究竟做错了什么?
解决方案
我究竟做错了什么?
没有。
显式默认定义与编译器生成的定义完全相同。在这种情况下,它将移动分配所有基地和成员。当然,这需要您默认的那些基础和成员的移动分配运算符可以访问。由于受到保护,您的可以访问。
这是一个 MSVC++ 错误。如果可以,请尝试更新到更高版本。
推荐阅读
- python - Python:For循环更改多个对象的1个属性
- mysql - 按日期和其他列计算最后一个条目
- c# - 将动态类型传递给抽象覆盖方法
- amazon-web-services - 如何使用 spark 读取 Amazon SQS
- azure - Azure:如何为另一个租户中的应用注册创建 SQL 外部用户?
- r - R - 如何从字符向量中删除重复的字符串
- spring-boot - Spring Boot 需要 spring-boot-starter-security 作为 ssl 的依赖项
- database - Clickhouse - 添加一个新列,默认值基于另一列
- c++ - “此库现在需要 C++11 或更高版本的编译器...”在编译 boost 库的“number_base.hpp”时
- javascript - 如何在jQuery的依赖下拉列表中获取选定的值?