2

我花了一个小时才找到这个问题。以下代码

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>error C2327: 'Test::_member' : 不是类型名称、静态或枚举
器 1>error C2065: '_member' : 未声明的标识符

一旦我替换为 ,错误就会int s = 0;消失int s;

这只发生在 MSVC 2013 中,而不是 2015 年。我很确定这是一个编译器错误,但我想确保它不是我不熟悉的 C++ 特性(在 C++11 和 C++ 之间发生了变化14)。

4

1 回答 1

1

[C++11: 12.6.2]在 C++11 中定义了 NSDMI,并且本节和文档中的任何其他部分都没有定义这样的语法约束。因此,它必须是一个实现错误。

而且,由于 GCC、Clang 和 Visual Studio 2015 都接受该代码,我认为不值得进行任何更详细的调查。

于 2016-07-07T15:14:37.570 回答