2016-01-09 2 views
4

Следующая если условия компиляции в Visual Studio C++:C++ статические и нестатическая объявление переменной, если условие

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

и

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

С другой стороны, гну компилятор только компилирует первый один. От тестирования кажется, что область действия переменной находится только в условии if.

Однако, поскольку Visual Studio компилирует обе версии, мне было интересно, есть ли какие-либо отличия?

ответ

3

Согласно стандарту C++, GNU является правильным, а VisualStudio делает это неправильно. После 6,4/1:

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

Это разрешено использовать типа-спецификатор-Seq и он не может содержать хранения класса спецификатор, такие как static. Чтобы узнать, что может иметь тип-спецификатор-seq, прочитайте this.

+1

Вы имеете в виду грамматику C++ 98, код действителен. – user657267

+0

Вопрос не указан в версии, но мой ответ - полезное замечание, чтобы выяснить, где возникает проблема. – deepmax

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 однако допускается типы должны быть определены в условиях, и это было исправлено для С ++ 14, хотя из-за недостаток команды GCC, похоже, задерживается на bugfix, который, похоже, может исправить эту проблему.