如果条件在Visual Studio C ++中编译,则以下内容:
if(int x = 5) { std::cout << x; } 1
和
if(static int x = 5) { std::cout << x; } 2
另一方面,gnu编译器只编译第一个编译器。 从测试来看,似乎变量的范围恰好在if条件下。
但是,由于Visual Studio编译了两个版本,我想知道是否有任何差异?
答案 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看起来它也可以解决这个问题。