将来会支持非平凡的指定初始值设定项吗(Post C ++ 17)?

时间:2018-06-25 15:09:01

标签: c++ designated-initializer

这受此post的启发, 不支持非平凡的指定初始值设定项

我已经读过this post,并且有一些答案声称已经支持此功能。

但是,使用C ++ 17和以下代码:

struct s {
    int a[2];
    s (int b): a{[1]=b} {} // error
};

s foo(1);

我仍然收到错误:

  

抱歉,未实现:非平凡指定   不支持初始化程序

     

s (int b): a{[1]=b} {}

我认为此功能确实很有帮助。

所以我的问题:

是否有计划为将来的C ++版本(在C ++ 17之后)提供支持?

  • 如果,为什么不支持它的最大障碍是什么?
  • 如果,那么当前的C ++版本有什么问题,为什么支持它花费的时间太长了

COMPILER

GNU C ++ 17-选中wandbox

1 个答案:

答案 0 :(得分:4)

为将指定的初始值设定项添加到C ++ 20(p0329r0)而采取的建议是有意限制的(请注意,作为一种官方语言功能,它特别是C ++ 20功能-但是gcc和clang支持基本上已经有很长一段时间了)

enter image description here

C ++是比C更复杂的语言,我们还有很多事情要担心。因此,我们得到的规则是您不能混合使用指示符和值,指示符按声明顺序出现,是唯一的,并且既不是嵌套索引也不是数组索引。就这样,这已经是一个非常有用的语言功能。

  

如果,为什么不支持它的最大障碍是什么

可能是动机。我们真的需要那种语法吗?这是需要解决的问题吗?不利的一面可能是解析模棱两可-您也许能够构造看起来很像lambda的数组索引初始化器。但是,如果您认为这是完全值得的,则可以编写建议。