在全局命名空间中使用变量

时间:2011-11-01 11:28:07

标签: c++

为什么这是一个错误?

int a = 0;
a = 42;

int main()
{
}

我可以找到这种行为的可能匹配:

  

(3.4.1 / 4)在全局范围内使用的名称,在任何函数,类之外   或用户声明的命名空间,应在全局使用之前声明   范围。

这可能是标准的缺陷吗?

2 个答案:

答案 0 :(得分:7)

int a = 0; //it is a declaration (and definition too) statement
a = 42;    //it is an assignment statement

第二行是错误原因,因为它是一个赋值语句。

在命名空间级别,只允许声明和定义语句。在命名空间级别不允许赋值语句。

并且“应在全局范围内使用之前声明”(来自规范的引用)表示以下内容:

int a = 42;

int b = 2 * a; //a is being used here

int c = a + b; //both a and b are being used here

如果您改为定义 type ,那么:

struct A {}; //definition of A

struct B { A a; }; //a is declared as member of B 
                   //(which means, A is being "used") 

void f(const A&, const B&); //both A and B are used in the declaration of f

答案 1 :(得分:1)

您无法在全局命名空间

中编写类似的赋值语句

它需要在main或某些[member]函数中

int main()
{
  a=42;

  return 0;
}