基类的返回类型与使用 auto 的派生类冲突

Conflict in return type from base class with derived class using auto

本文关键字:派生 冲突 auto 返回类型 基类      更新时间:2023-10-16

我有以下代码:

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 布局复杂化,因此最好禁止这样做。