将来是不是会支持非平凡的指定初始化程序(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 后)?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2013 CTP 是不是支持非整数类型的类内静态常量初始化程序?
如何使用非平凡(POD)类的缓冲区协议实现 pybind11