为什么带有类内初始值设定项的局部结构隐藏类的变量?



考虑下面的代码:

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;
}

编辑:仅供参考,你试图初始化一个非常量静态成员在一个局部类。

最新更新