【问题标题】:Conflict in return type from base class with derived class using auto使用 auto 的基类与派生类的返回类型冲突
【发布时间】:2016-06-09 12:36:46
【问题描述】:

我有以下代码:

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_(因此返回类型)都是 Aauto 的类型是否在不同的编译阶段推导出来,例如检查虚拟覆盖的类型?当然,如果您将 auto 替换为正确的类型,这将编译 - 但这不是重点。

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

main.cpp:8:11: 错误:虚函数“内部”的返回类型是 与它覆盖的函数的返回类型不协变('auto &' 不是从 'A &' 派生的)

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

main.cpp:4:16: 注意:被覆盖的虚函数在这里

virtual A& internal() = 0;
        ~~ ^

生成 1 个错误。

【问题讨论】:

  • 想知道为什么要将运行时多态性(虚拟函数)与优雅的编译器时类设计(模板)混合在一起?
  • @BeyelerStudios,我看了那个问题,但我不相信它是(虽然我可能是错的..)
  • 在 Visual Studio 中我得到:“错误 C3542:Derives::internal:虚拟成员函数不应具有包含 auto 的返回类型”
  • @JonathanMee,没有 VS 的访问权限,所以无法用它进行测试...我想它对 gcc/clang 修复错误很有用,但是嘿嘿..
  • @sleeptightpupper,我不明白你的意思(如果你用真实类型替换auto)上面的代码应该编译..

标签: c++ c++14


【解决方案1】:

来自[dcl.spec.auto]

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

internal()是虚函数,所以不能使用auto

original proposal 表示原因:

允许对虚函数进行返回类型推导是可能的,但这会使覆盖检查和 vtable 布局变得复杂,因此最好禁止这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2021-06-18
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多