将来是否会支持非平凡的指定初始值设定项 (Post C++17)?
Are non-trivial designated initializers going to be supported in the future (Post C++17)?
这是受此 post 的启发,其中
不支持非平凡的指定初始化程序。
我已经阅读 this post 并且一些回答声称已经支持此功能。
但是,使用 C++17 和此代码:
struct s {
int a[2];
s (int b): a{[1]=b} {} // error
};
s foo(1);
我仍然得到错误:
sorry, unimplemented: non-trivial designated
initializers not supported
s (int b): a{[1]=b} {}
我觉得这个功能真的很有用。
所以我的问题:
是否计划在未来的 C++ 版本 (post C++17) 中支持此功能?
- 如果不,最大的障碍是什么不支持
- 如果是,当前的 C++ 版本有什么问题,为什么需要很长时间才能支持
编译器
GNU C++17 - 检查wandbox
为 C++20 (p0329r0) 添加指定初始化器的提案是有意限制的(请注意,作为官方语言功能,它具体是 C++20 功能 - 但 gcc 和 clang基本上已经支持此功能很长时间了):
C++是一门比C更复杂的语言,我们要操心的事情也更多。所以我们得到的规则是你不能混合指示符和值,指示符按声明顺序出现,是唯一的,既不是嵌套索引也不是数组索引。这已经是一个非常有用的语言功能了。
If not, what is the biggest hindrance why it's not going to be supported
可能是动机。我们真的需要那种语法吗?这是一个需要解决的问题吗?不利的一面是,可能存在解析歧义——您可以构建看起来很像 lambda 的数组索引初始值设定项。但如果你认为它足够值得,你可以写一份提案。
这是受此 post 的启发,其中 不支持非平凡的指定初始化程序。
我已经阅读 this post 并且一些回答声称已经支持此功能。
但是,使用 C++17 和此代码:
struct s {
int a[2];
s (int b): a{[1]=b} {} // error
};
s foo(1);
我仍然得到错误:
sorry, unimplemented: non-trivial designated initializers not supported
s (int b): a{[1]=b} {}
我觉得这个功能真的很有用。
所以我的问题:
是否计划在未来的 C++ 版本 (post C++17) 中支持此功能?
- 如果不,最大的障碍是什么不支持
- 如果是,当前的 C++ 版本有什么问题,为什么需要很长时间才能支持
编译器
GNU C++17 - 检查wandbox
为 C++20 (p0329r0) 添加指定初始化器的提案是有意限制的(请注意,作为官方语言功能,它具体是 C++20 功能 - 但 gcc 和 clang基本上已经支持此功能很长时间了):
C++是一门比C更复杂的语言,我们要操心的事情也更多。所以我们得到的规则是你不能混合指示符和值,指示符按声明顺序出现,是唯一的,既不是嵌套索引也不是数组索引。这已经是一个非常有用的语言功能了。
If not, what is the biggest hindrance why it's not going to be supported
可能是动机。我们真的需要那种语法吗?这是一个需要解决的问题吗?不利的一面是,可能存在解析歧义——您可以构建看起来很像 lambda 的数组索引初始值设定项。但如果你认为它足够值得,你可以写一份提案。