为什么允许这种C ++类型演绎

时间:2018-07-03 14:37:14

标签: c++ type-deduction

我遇到了一些生产代码,这使我怀疑为什么要编译。 我将其精简如下。

我使用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 ::的类型也没有关系,它仍然可以编译。

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

1 个答案:

答案 0 :(得分:3)

这是预期的行为,称为injected class nameX::X引用类名X,与X::X::X相同,依此类推。 X::X::XY在这里与X::XY相同。

  

在类范围内,当前类的名称被视为公共成员名称;这称为注入类名称。


BTW:这与type deduction没有关系;通常用作C ++的另一个术语。