if条件下的C ++静态和非静态变量声明

时间:2016-01-09 10:59:40

标签: c++ g++ gnu

如果条件在Visual Studio C ++中编译,则以下内容:

if(int x = 5) { std::cout << x; }                  1

if(static int x = 5) { std::cout << x; }           2

另一方面,gnu编译器只编译第一个编译器。 从测试来看,似乎变量的范围恰好在if条件下。

但是,由于Visual Studio编译了两个版本,我想知道是否有任何差异?

2 个答案:

答案 0 :(得分:3)

根据C ++标准,GNU是正确的,VisualStudio做错了。遵循6.4 / 1:

condition:
    expression
    type-specifier-seq declarator = assignment-expression

允许使用 type-specifier-seq ,它不能包含存储类说明符,例如static。要查看类型说明符-seq可以包含的内容,请阅读this

答案 1 :(得分:2)

从C ++ 11开始,这是有效的:

condition: 
  expression 
  attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause 
  attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

标准中的defect允许在条件中定义类型,并且这已经针对C ++ 14进行了修复,尽管由于缺陷,GCC团队似乎已经暂停{{3看起来它也可以解决这个问题。