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

有帮助吗?

解决方案

您指的示例 已知不一致. 。委员会尚未解决此问题。

那么,这是GCC和VS2010中的错误吗?

我认为这不是GCC/VS2010/Clang或Comeau的错误。它似乎是C ++标准中的错误。在这些情况下,编译作家必须下定决心最可行的东西。如果您删除了所讨论的示例,则3.3/4表示示例有效:“给定单个声明区域中的一组声明,每个声明区域都指定相同的不合格名称,...他们应全部参考相同的实体,或全部指函数和功能模板;或...”。

正如链接的问题所讨论的那样,出现的问题是7.3.3/8所指的“声明”时,委员会没有达成共识。因此,在此之前,3.3/4适用于GCC/VS2010和Clang,而Comeau则选择使用其他一些语义。

其他提示

是的你是对的。这确实是G ++,MSVC ++和Clang中的错误。 Comeau已经正确了。

如你所说 7.3.3/8

使用解释是声明,因此可以在允许多个声明的情况下重复使用

还提供了以下代码段。

void f()
{
    using A::i;
    using A::i;  //error: double declaration
}

同样,您的代码也不明显。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top