c++ - 为什么允许这种 C++ 类型推导
问题描述
我遇到了一些生产代码,这让我想知道它为什么要编译。我将其提炼为以下内容。
我用 gcc 6.4.1 和 8.1 以及其他几个在线编译器编译它,它们都没有报告错误。
struct Y
{
};
struct X
{
using XY = Y;
};
struct VZ
{
virtual void f( X::X::XY xy ) = 0;
};
struct Z : public VZ
{
virtual void f( X::XY xy ) override {}
};
int main( int c, char *v[] )
{
}
请注意,纯虚拟是用看起来不正确的类型 (X::X::XY) 声明的。多少个 X:: 我在类型前加上,它仍然可以编译,这也没有区别。
我怀疑这可能是一个简单的解析器问题,但不确定。
解决方案
这是预期的行为,它被称为注入类名。X::X
指类名X
,与 相同X::X::X
,以此类推。X::X::XY
和这里一样X::XY
。
在类作用域中,当前类的名称被视为公共成员名称;这称为注入类名。
BTW:这与类型推导无关;通常用作 C++ 的另一个术语。
推荐阅读
- xml - 最喜欢的过滤器 Odoo 10
- mysql - HQL 当前日期
- typescript - 将 Typescript 更新到 v3.2.1,SDK 文件夹中没有 tsc.exe
- android - 如何在recyclerview中显示图像?
- spring-mvc - 使用自定义转换器将查询参数映射到模型
- ms-access - 如何通过 VBA 代码连接控件及其标签?
- robotium - 机器人录音失败
- laravel-5 - 拉拉维尔 | 更新查询返回 "[{"laboratory":"Boulanger"}]" 作为值而不是 "Boulanger"
- build - 如何将 azure devops 构建复制到本地计算机
- c# - Asp.net mvc ADD 认证账户控制器