将来是不是会支持非平凡的指定初始化程序(C++ 17 后)?

Posted

技术标签:

【中文标题】将来是不是会支持非平凡的指定初始化程序(C++ 17 后)?【英文标题】:Are non-trivial designated initializers going to be supported in the future (Post C++17)?将来是否会支持非平凡的指定初始化程序(C++ 17 后)? 【发布时间】:2018-06-25 15:09:01 【问题描述】:

这是受到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++ 版本有什么问题,为什么它需要很长时间才能得到支持

编译器

GNU C++17 - 检查wandbox

【问题讨论】:

相关/欺骗:***.com/questions/18731707/… 在 C++ 标准中,存在 C++ 委员会认为更可取的替代方案。我猜这不太可能改变,因为没有令人信服的论点。对于 gcc/g++,它归结为编译器开发人员有意识地决定在他们的 C 编译器中也不支持指定的初始化程序,而是支持特定于编译器的扩展。 @codekaizer 想要我把它作为一个副本关闭吗? @NathanOliver,那里接受的答案没有回答我的问题,也许这篇文章可以作为 2018 年以后的参考。 【参考方案1】:

通过向 C++20 (p0329r0) 添加指定初始化程序的提议是有限的,有意的(请注意,作为官方语言特性,它专门是 C++20 特性 - 但 gcc 和 clang 基本上支持这一点功能已经很久了):

C++ 是一种比 C 更复杂的语言,我们需要担心的事情更多。所以我们得到的规则是你不能混合指示符和值,指示符按声明顺序出现,是唯一的,既不是嵌套索引也不是数组索引。这已经是一个非常有用的语言特性了。

如果,最大的障碍是什么导致它不被支持

动机,可能。我们真的需要那种语法吗?这是一个需要解决的问题吗?不利的一面是,可能存在解析歧义 - 您可能能够构建看起来很像 lambda 的数组索引初始化程序。但如果你认为它足够值得,你可以写一个提案。

【讨论】:

您可能想使用 wg21.link 指向latest version R4,它在what is supported and what is not 上有一个很好的部分。也似乎like clang and gcc support different things in the extension in C++ 虽然也许clang 只是不诊断不受支持的功能。 @ShafikYaghmour 我非常明确地想指出 R0,因为我截屏的部分是 R0,R4 只是措辞。 @Barry,谢谢你的详细解释。我同意你关于解析歧义的观点。

以上是关于将来是不是会支持非平凡的指定初始化程序(C++ 17 后)?的主要内容,如果未能解决你的问题,请参考以下文章

非平凡Java数学练习

Visual Studio 2013 CTP 是不是支持非整数类型的类内静态常量初始化程序?

如何使用非平凡(POD)类的缓冲区协议实现 pybind11

在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078

开源非平凡 SOA 示例

sqlalchemy:与多个表的非平凡的一对一关系