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

4

2 回答 2

11

您引用的示例已知是不一致的。委员会还没有解决这个问题。

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

我认为这不是 GCC/VS2010/Clang 或 Comeau 中的错误。它似乎是 C++ 标准中的一个错误。在这些情况下,编译作者必须决定什么是最可行的。如果您删除有问题的示例,则 3.3/4 声明该示例是有效的:“给定单个声明区域中的一组声明,每个声明都指定相同的非限定名称,......它们都应引用相同的实体, 或全部引用函数和函数模板;或 ...”。

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

于 2010-11-23T23:33:53.813 回答
1

是的你是对的。这确实是 g++、MSVC++ 和 Clang 中的一个错误。科莫说得对。

正如你7.3.3/8所说

using-declaration 是一个声明,因此可以在允许(并且仅在)允许多个声明的地方重复使用

还给出了以下代码片段。

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

同样,您的代码也是格式错误的。

于 2010-11-23T03:25:08.903 回答