可以将变量重新声明为推导为相同类型的auto吗?

时间:2016-05-24 07:57:07

标签: c++ c++11 language-lawyer extern auto

标准是否允许以下​​内容?

#include <iostream>

extern int a;
auto a = 3;

int main(int, char**)
{
    std::cout << a << std::endl;
    return 0;
}

clang接受代码。 g++抱怨声明冲突。

2 个答案:

答案 0 :(得分:2)

从标准中我不太清楚,但是,有这个写的

  

第7.1.6.4节自动说明符
  在本节未明确允许的上下文中使用auto的程序是不正确的。

最好阅读所有允许的上下文标准的上述部分。

考虑到这一点,我相信g ++是正确的,并且铿锵有误。但我可能是错的,标准中可能有一些单独的部分可能暗示这种情况,但我找不到它。

答案 1 :(得分:-2)

编辑答案: 正如评论中提到的那样。这种情况下的问题是写作

external int a;
auto a = 3;

与写作相同

external int a;
int a = 3;

这意味着你有一个新的a定义并导致错误。

第一个回答: 根据我的理解,这会破坏One定义规则的一部分。具体来说,我的意思是以下规则(参考MISRA C ++ 2008),该规则表明具有外部链接的标识符应始终只有一个定义。在您的示例中,您在当前文件(auto a = 3;)中有一个定义,而在外部您也可以引用另一个文件中的定义。