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

Nim*_*Nim 8 c++ c++14

我有以下代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

这无法编译(在coliru上测试 - 使用gcc),返回类型冲突 - 我的问题是为什么编译器不能推断出两者internal_(因此返回类型)A?是否在auto编译的不同阶段推断出类型,例如检查虚拟覆盖的类型?当然,如果你auto用正确的类型替换它会编译- 但这也是重点.

(这是铿锵错误,gcc有点类似)

main.cpp:8:11:错误:虚函数'internal'的返回类型与它覆盖的函数的返回类型不一致('auto&'不是从'A&'派生的)

auto& internal() override { // <-- conflicting return type
~~~~~ ^
Run Code Online (Sandbox Code Playgroud)

main.cpp:4:16:注意:重写的虚函数就在这里

virtual A& internal() = 0;
        ~~ ^
Run Code Online (Sandbox Code Playgroud)

生成1个错误.

Bar*_*rry 14

来自[dcl.spec.auto]:

使用占位符类型的返回类型声明的函数不应为虚拟([class.virtual]).

internal()是一个虚函数,所以你不能使用auto.

原来的建议表示此推理:

允许对虚函数进行返回类型推导是可能的,但这会使重写检查和vtable布局复杂化,因此似乎最好禁止这种情况.