考虑下面的代码:
class A
{
public:
void f();
private:
int foo;
};
void A::f( )
{
struct S
{
int bar = 100;
} s;
s.bar = foo;
}
这不会与VS2013编译,在最后一行给出C2327和C2065错误。但是,如果删除初始化式或将结构体声明放在外部,则会编译。这是错误还是标准行为?
编辑:对于完整的问题,这里有错误信息:
错误C2327: 'A::foo':不是类型名、静态或枚举数
错误C2065: 'foo':未声明的标识符
代码与VS2015 RC(最终)是好的。所以VS 2013有一个类初始化的bug。以下代码适用于VS 2013
class A
{
public:
void f();
private:
int foo;
};
void A::f( )
{
struct S
{
int bar;
S(int b = 0) : bar{b} {}
} s;
s.bar = foo;
}
你的代码完全合法。我猜MSVC对"新"(即c++ 11)有问题。"在类初始化器" int bar = 100;
.
要么使用更现代的编译器,或者,如果你坚持使用MSVC 2013,要么写c++ 98,要么准备好得到正确代码的随机编译错误
试试吧。
class A
{
public:
void f();
private:
int foo;
};
void A::f( )
{
struct S
{
int bar;
S() { bar = 100; }
} s;
s.bar = foo;
}
编辑:仅供参考,你试图初始化一个非常量静态成员在一个局部类。