我遇到了一些生产代码,这使我怀疑为什么要编译。 我将其精简如下。
我使用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 ::的类型也没有关系,它仍然可以编译。
我怀疑这可能是一个简单的解析器问题,但不确定。
答案 0 :(得分:3)
这是预期的行为,称为injected class name。 X::X
引用类名X
,与X::X::X
相同,依此类推。 X::X::XY
在这里与X::XY
相同。
在类范围内,当前类的名称被视为公共成员名称;这称为注入类名称。
BTW:这与type deduction没有关系;通常用作C ++的另一个术语。