首页 > 解决方案 > 为什么允许这种 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:: 我在类型前加上,它仍然可以编译,这也没有区别。

我怀疑这可能是一个简单的解析器问题,但不确定。

标签: c++type-deduction

解决方案


这是预期的行为,它被称为注入类名X::X指类名X,与 相同X::X::X,以此类推。X::X::XY和这里一样X::XY

在类作用域中,当前类的名称被视为公共成员名称;这称为注入类名。


BTW:这与类型推导无关;通常用作 C++ 的另一个术语。


推荐阅读