基类的返回类型与使用 auto 的派生类冲突
Conflict in return type from base class with derived class using auto
我有以下代码:
struct A{};
struct Base {
virtual A& internal() = 0;
};
struct Derives : public Base {
auto& internal() override { // <-- conflicting return type
return internal_;
}
private:
A internal_;
};
int main() {
Derives d;
auto& internal = d.internal();
}
这无法编译(在 coliru 上测试 - 使用 gcc)与冲突的返回类型 - 我的问题是为什么编译器不能推断出两个internal_
(以及返回类型)都是A
?例如,为auto
推断的类型是否处于不同的编译阶段,而不是检查虚拟覆盖的类型?当然,如果您将auto
替换为正确的类型,则可以编译 - 但这不是重点。
(这是 clang 错误,gcc 有点相似)
主.cpp:8:11: 错误: 虚拟函数"内部"的返回类型为 与它覆盖的函数的返回类型不协变('auto &' 不是从 'A &' 派生的)
auto& internal() override { // <-- conflicting return type ~~~~~ ^
主.cpp:4:16:注意:被覆盖的虚拟函数在这里
virtual A& internal() = 0; ~~ ^
生成 1 个错误。
来自 [dcl.spec.auto]:
使用使用占位符类型的返回类型声明的函数不应是虚拟的([class.virtual])。
internal()
是一个虚拟函数,所以你不能使用auto
。
最初的提案指出了这样做的理由:
可以允许对虚函数进行返回类型推断,但这会使覆盖检查和 vtable 布局复杂化,因此最好禁止这样做。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 写入位置0x0000000C时发生访问冲突
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 对派生自同一基类的类实现冲突检查
- 冲突的声明(外部基础与派生)
- 基类的返回类型与使用 auto 的派生类冲突
- 派生类中的非虚函数C++名称与“final”说明符冲突
- 从派生类中的强制转换泛型指针访问成员会导致访问冲突