命名空间使用声明(GCC / VS2010中的错误)?

时间:2010-11-23 03:16:17

标签: c++ namespaces using-declaration

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,因为它与手头的查询无关。

2 个答案:

答案 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
}

同样,您的代码也是不正确的。