【发布时间】:2018-09-20 10:38:50
【问题描述】:
最近我看到了这个 C++ 标准段落 (http://eel.is/c++draft/expr.post#expr.call-5):
如果后缀表达式指定析构函数,则函数调用表达式的类型为 void;否则,函数调用表达式的类型是静态选择函数的返回类型(即忽略 virtual 关键字),即使实际调用的函数类型不同。此返回类型应为对象类型、引用类型或 cv void。
这部分我不是很懂:
函数调用表达式的类型是静态选择函数的返回类型(即忽略virtual关键字),即使实际调用的函数类型不同。
- 这里静态选择的函数是什么?
- 如何静态选择虚函数?我一直以为是在运行时选择的。
即使实际调用的函数类型不同。
调用表达式如何实际调用所选择的不同类型的函数?
【问题讨论】:
-
笨拙的措辞提醒读者名称查找、重载解析和表达式类型的确定是在编译时完成的,因为 C++ 是一种静态类型语言。没有必要提醒读者 std,因为它几乎无处不在。名称查找显然不能在评估表达式的动态类型中完成。访问控制还考虑静态类型。模板也不会在运行时实例化!
标签: c++ language-lawyer virtual-functions static-typing covariant-return-types