【问题标题】:Namespace using declaration (bug in GCC/VS2010)?使用声明的命名空间(GCC/VS2010 中的错误)?
【发布时间】:2011-05-14 05:45:08
【问题描述】:
namespace A{
   int i;
}

int main(){
   using A::i;
   using A::i;
}

VS2010 - 编译良好​​p>

gcc (ideone) - 编译良好​​p>

Comeau - 给出错误“ComeauTest.c”,第 10 行:错误:“i”已在当前范围内声明 使用 A::i;"

$7.3.3/8 - “使用声明是 声明,因此可以使用 反复在哪里(并且只在哪里) 允许多个声明。”

上面的例子表明代码确实格式错误。

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

编辑 2:

删除多个using directives,因为它与手头的查询无关。

【问题讨论】:

  • 我的理解是它应该是 Comeau 中的一个错误,而不是 MSVC/GCC,出于同样的原因,这很好:int main(){ extern int i; extern int i;}。显然我错过了一些简单的东西。
  • @GMan :检查一次7.3.3/8
  • @Prasoon:没有比这更直接的了,谢谢。
  • @Alf: 我同意 [OneMoreCharNeededButI'llPutThisLongFillerTextInInsteadBecauseIAmIrritated]
  • @GMan 我仍然认为 MSGC/GCC/Clang 没有它错误。我不认为有人可以争辩说 Comeau 错了,因为显然意图是错了,但是说其他人错了对我来说似乎有点太重了(因为意图基于什么规范性文本在?)。请参阅我对@Jame 答案的评论。

标签: c++ namespaces using-declaration


【解决方案1】:

你提到的例子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 选择使用其他一些语义。

【讨论】:

    【解决方案2】:

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

    正如你所说的7.3.3/8

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

    下面的代码sn-p也给出了。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2014-09-24
      相关资源
      最近更新 更多