c++ - 为什么虚函数不能使用返回类型推导?

标签 c++ c++14 auto virtual-functions vtable

n3797说:

第 7.1.6.4/14 节:

A function declared with a return type that uses a placeholder type shall not be virtual (10.3).

因此以下程序是非良构的:

struct s
{
    virtual auto foo()
    {
    }
};

我能找到的所有理由都是来自 n3638 的模糊单行字。 :

virtual

It would be possible to allow return type deduction for virtual functions, but that would complicate both override checking and vtable layout, so it seems preferable to prohibit this.

谁能提供进一步的理由或给出一个与上述引用一致的好(代码)示例?

最佳答案

您所包含的基本原理是相当清楚的:自然,虚函数意味着被子类覆盖,因此作为基类的设计者,您应该尽可能容易地为继承您的类的人提供合适的覆盖。但是,如果您使用 auto,则确定覆盖的返回类型对于程序员来说是一项乏味的任务。编译器的问题会少一些,但人类会有很多机会感到困惑。

例如,如果您看到如下所示的 return 语句

return a * 3 + b;

您必须将程序追溯到 ab 的声明点,找出类型提升,并决定返回类型应该是什么。

语言设计者似乎发现这会让人感到困惑,并决定不允许此功能。

关于c++ - 为什么虚函数不能使用返回类型推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26268721/

相关文章:

c++ - 汽车扣除不一致

c++ - 为什么 auto 不能是函数的返回类型?

c++ - 在 C++11 中使用基于范围的 for 循环替换传统的嵌套循环

c++ - 等轴测图,鼠标 pos->tile 坐标公式中的坐标不正确

c++ - 如何直接在Makefile中导出?

c++ - 为什么我们需要定义一个类的静态变量,而函数内部却不定义静态变量?

c++ - 在 C++ 中异步读取文件

c++ - 我可以在 C++ 中使用 Tk 吗?

c++ - 使用头文件和 StdAfx.h

c++ - 是否可以在 C++14 中创建具有可选模板参数的类型元组?