以下代码是否有效?typedef /别名声明的声明
struct B{ using X=int; };
struct D1:B{ using X=X; }; // (1)
struct D2:B{ typedef X X; }; // (2)
我希望D2 :: X的申报点(2),但似乎都GCC 4.8和3.2铿锵接受它是两个X之间。 这是标准行为吗?对工作草案/标准的参考将不胜感激。
以下代码是否有效?typedef /别名声明的声明
struct B{ using X=int; };
struct D1:B{ using X=X; }; // (1)
struct D2:B{ typedef X X; }; // (2)
我希望D2 :: X的申报点(2),但似乎都GCC 4.8和3.2铿锵接受它是两个X之间。 这是标准行为吗?对工作草案/标准的参考将不胜感激。
有上using X = X
是否应该拿起或定义X
的存在潜在已在范围X
的辩论。为了避免“未知类型”并使其与typedef
相似,裁定在其待分配的类型表达式中不可见(,因此不是类似于int x = x
,它类似于typedef x x;
)。
回想一下,typedef
只是与typedef
关键字前面加上一个正常的声明。第一个提到的X
没有声明任何东西,它只是说什么类型将被别名。这是与using X = X
的主要区别,如果委员会决定那样,那么可能会在之前宣布X
。
但是请注意,您的代码有有效未定义的行为,因为它违反了没有要求的诊断规则。 3.3.7p1b2
在一个S类使用应指在其上下文相同的声明和当A名称为N在没有诊断需要一个该规则的冲突S的完成范围重新评估。
在typedef
声明中,最终名称是正在声明的名称,这就是声明的要点。所以第一个X
出现在D2::X
声明之前,因此解析为B::X
。