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

时间:2016-06-09 12:36:46

标签: 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();
}

这无法编译(在coliru上测试 - 使用gcc)并且返回类型有冲突 - 我的问题是为什么编译器不能推断出internal_(因此返回类型)都是{{1} }?是否在编译的不同阶段推导出A的类型,而不是检查虚拟覆盖的类型?当然,如果用正确的类型替换auto,这会编译 - 但这不是重点。

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

  

main.cpp:8:11:错误:返回虚函数'internal'的类型   与它覆盖的函数的返回类型不协变('auto   &安培;”不是来自'A&amp;')

auto
     

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

auto& internal() override { // <-- conflicting return type
~~~~~ ^
     

生成了1个错误。

1 个答案:

答案 0 :(得分:14)

来自[dcl.spec.auto]

  

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

internal()是一个虚拟函数,因此您无法使用auto

original proposal表示理由:

  

可以允许虚函数的返回类型推导,但这会使重写检查和vtable布局复杂化,所以似乎最好禁止它。