使用统一初始化语法使用初始化列表进行类内成员初始化?

时间:2014-06-04 10:46:19

标签: c++ c++11 initializer-list uniform-initialization in-class-initialization

我正在尝试使用MSVC2013编译以下内容:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
}

编译器给出了以下错误:SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

如果我将代码更改为:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

程序编译并运行正常。这是编译器的问题,还是我不理解语法?根据我一直在阅读的内容,第一个版本应该编译。

2 个答案:

答案 0 :(得分:1)

以下是N3797的负责语法:

// after a member declaration:
braced-or-equal-initializer-list:
  = initializer-clause
  braced-init-list

braced-init-list:
  { initializer-list ,OPT }
  { }

initializer-list:
  initializer-clause
  initializer-list, initializer-clause

initializer-clause:
  assignment-expression
  braced-init-list

所以我说第一个陈述是正确的,它确实被接受了 最近的gccclang

答案 1 :(得分:1)

如果需要放置分号

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
};

那么它似乎是MS VC ++ 2013编译器的一个错误。至少代码是在www.ideone.com上成功编译的。

Structire SomeStruct是一个聚合,应使用初始化列表进行初始化。

相关问题