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 все принимают код, я не думаю, что более подробное исследование имеет смысл.

Другие вопросы по тегам