我有以下代码:
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有点类似)
main.cpp:8:11:错误:虚拟函数“内部”的返回类型与其所覆盖的函数的返回类型不协变(“自动&”不是从“ A&”派生的)
auto& internal() override { // <-- conflicting return type ~~~~~ ^
main.cpp:4:16:注意:此处覆盖了虚函数
virtual A& internal() = 0; ~~ ^
产生1个错误。
使用占位符类型声明为返回类型的函数不能是虚函数([class.virtual])。
internal()
是一个虚函数,因此您不能使用auto
。
在原来的建议表示此推理:
可能允许对虚函数进行返回类型推导,但是这会使覆盖检查和vtable布局复杂化,因此似乎最好禁止这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句