Struct может быть объявлен внутри тела метода, но только если он не содержит инициализаторов поля-члена. Ошибка компилятора или нет?
Мне понадобился хороший час, чтобы найти эту проблему. Следующий код
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).
1 ответ
[C++11: 12.6.2]
определяет NSDMI в C++11, и ни этот раздел, ни какой-либо другой раздел в документе не определяют такого ограничения синтаксиса. Следовательно, это должна быть ошибка реализации.
И, поскольку GCC, Clang и Visual Studio 2015 все принимают код, я не думаю, что более подробное исследование имеет смысл.