namespace A{
int i;
}
int main(){
using A::i;
using A::i;
}
VS2010 - 编译好
gcc(ideone) - 编译好
Comeau - 给出错误“”ComeauTest.c“,第10行:错误:”i“已在当前范围内声明 使用A :: i;“
$ 7.3.3 / 8 - “使用声明是一个 声明,因此可以使用 反复在哪里(只在哪里) 允许多个声明。“
这里的例子表明代码确实是不正确的。
那么,这是GCC和VS2010中的一个错误吗?
编辑2:
删除多个using directives
,因为它与手头的查询无关。
答案 0 :(得分:11)
您引用is known to be inconsistent的示例。该委员会尚未解决此问题。
那么,这是GCC和VS2010中的一个错误吗?
我认为这不是GCC / VS2010 / Clang或Comeau中的错误。它似乎是C ++标准中的一个错误。在这些情况下,编译作者必须在最可行的事情上下定决心。如果删除有问题的示例,则3.3 / 4表示示例有效:“在单个声明性区域中给出一组声明,每个声明都指定相同的非限定名称,......它们都应引用同一个实体,或全部参考功能和功能模板;或......“。
问题出现了,正如相关问题中所讨论的那样,7.3.3 / 8指的是何时提出“声明”,委员会没有达成共识。因此,在此之前3.3 / 4适用于GCC / VS2010和Clang,而Comeau则选择使用其他一些语义。
答案 1 :(得分:1)
是的,你是对的。这确实是g ++,MSVC ++和Clang中的一个错误。 Comeau说得对。
如你所说7.3.3/8
说
using声明是一个声明,因此可以在允许多个声明的地方重复使用
还提供了以下代码段。
void f()
{
using A::i;
using A::i; //error: double declaration
}
同样,您的代码也是不正确的。