结构可以在方法体内声明,但前提是它不包含成员字段初始值设定项。编译器错误与否?
Struct can be declared within method body, but only if it doesn't contain member field initializers. Compiler bug or not?
我花了一个小时才找到这个问题。以下代码
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' : is not a type name, static, or
enumerator
1>error C2065: '_member' : undeclared identifier
当我用 int s;
替换 int s = 0;
时,错误就消失了。
这只发生在 MSVC 2013 中,而不是 2015 中。我很确定这是一个编译器错误,但我想确保它不是我不熟悉的某些 C++ 特性(在 C++ 之间发生了变化) 11 和 C++14).
[C++11: 12.6.2]
在 C++11 中定义了 NSDMI,本节和文档中的任何其他部分都没有定义这种语法约束。因此,这一定是一个实现错误。
而且,由于 GCC、Clang 和 Visual Studio 2015 都接受该代码,我认为不值得进行更详细的调查。
我花了一个小时才找到这个问题。以下代码
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' : is not a type name, static, or enumerator
1>error C2065: '_member' : undeclared identifier
当我用 int s;
替换 int s = 0;
时,错误就消失了。
这只发生在 MSVC 2013 中,而不是 2015 中。我很确定这是一个编译器错误,但我想确保它不是我不熟悉的某些 C++ 特性(在 C++ 之间发生了变化) 11 和 C++14).
[C++11: 12.6.2]
在 C++11 中定义了 NSDMI,本节和文档中的任何其他部分都没有定义这种语法约束。因此,这一定是一个实现错误。
而且,由于 GCC、Clang 和 Visual Studio 2015 都接受该代码,我认为不值得进行更详细的调查。