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

3

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

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

编译器给我以下错误提示:SomeClass::SomeStruct::SomeStruct: 没有重载的函数接受3个参数。 如果我修改代码为:
class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

程序可以编译和运行,这是编译器的问题还是我不理解语法?从我所读的内容来看,第一个版本应当可以编译。


你使用的编译器是什么?这在gcc 4.9clang TRUNK上编译得很好。 - pmr
1
编译器错误。请参见https://dev59.com/qHjZa4cB1Zd3GeqPayw7和http://connect.microsoft.com/VisualStudio/feedback/details/792161/constructor-initializer-list-does-not-support-braced-init-list-form。 - pmr
2个回答

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
如果按要求放置分号
class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
};

似乎这是 MS VC++ 2013 编译器的一个错误。至少在 www.ideone.com 上,该代码可以成功编译。
SomeStruct 结构体是一个聚合体,应使用初始化列表进行初始化。

是的,那个问题中有一个打字错误。谢谢,现在正在更新。 - Dan Nestor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接