Мне понадобился хороший час, чтобы найти эту проблему. Следующий код
class Test {
public:
void method();
int _member;
};
void Test::method()
{
struct S {
int s = 0; // same with int s {0};
};
_member;
}
int main(int argc, const char* argv [])
{
return 0;
}
Выдает ошибку компиляции:
1> ошибка C2327: «Test :: _ member»: не является именем типа, статическим или
счетчик
1> ошибка C2065: ‘_member’: необъявленный идентификатор
И ошибка уходит, как только я заменяю int s = 0;
с int s;
,
Это происходит только в MSVC 2013, а не 2015. Я почти уверен, что это ошибка компилятора, но я хочу убедиться, что это не та особенность C ++, с которой я не знаком (что-то изменилось между C ++ 11 и C ++ 14).
[C++11: 12.6.2]
определяет NSDMI в C ++ 11, и ни этот раздел, ни какой-либо другой раздел в документе не определяют такого ограничения синтаксиса. Следовательно, это должна быть ошибка реализации.
И, поскольку GCC, Clang и Visual Studio 2015 все принимают код, я не думаю, что более подробное исследование имеет смысл.
Других решений пока нет …