2012-11-18 104 views
2

以下代码是否有效?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之间。 这是标准行为吗?对工作草案/标准的参考将不胜感激。

回答

4

有上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的完成范围重新评估。

2

typedef声明中,最终名称是正在声明的名称,这就是声明的要点。所以第一个X出现在D2::X声明之前,因此解析为B::X