我有以下代码:
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个错误。
答案 0 :(得分:14)
使用占位符类型的返回类型声明的函数不应为虚拟([class.virtual])。
internal()
是一个虚拟函数,因此您无法使用auto
。
original proposal表示理由:
可以允许虚函数的返回类型推导,但这会使重写检查和vtable布局复杂化,所以似乎最好禁止它。