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).

2

Решение

[C++11: 12.6.2] определяет NSDMI в C ++ 11, и ни этот раздел, ни какой-либо другой раздел в документе не определяют такого ограничения синтаксиса. Следовательно, это должна быть ошибка реализации.

И, поскольку GCC, Clang и Visual Studio 2015 все принимают код, я не думаю, что более подробное исследование имеет смысл.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]