为什么 C 11 不支持像 C99 一样的指定初始化列表?

新手上路,请多包涵

考虑:

 struct Person
{
    int height;
    int weight;
    int age;
};

int main()
{
    Person p { .age = 18 };
}

上面的代码在 C99 中是合法的,但在 C++11 中是不合法的。

c++11 标准委员会排除对这种方便功能的支持的理由是什么?

原文由 xmllmx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 796
2 个回答

C++ 有构造函数。如果只初始化一个成员是有意义的,那么可以通过实现适当的构造函数在程序中表达。这是 C++ 提倡的那种抽象。

另一方面,指定的初始值设定项功能更多的是公开和使成员易于直接在客户端代码中访问。这会导致一个人 18 岁(岁?)但身高和体重为零。


换句话说,指定的初始化器支持暴露内部结构的编程风格,并且客户端可以灵活地决定他们希望如何使用该类型。

C++ 更感兴趣的是把灵活性放在类型 设计者 的一边,因此设计者可以使正确使用类型变得容易,并且难以错误使用。让设计人员控制如何初始化类型是其中的一部分:设计人员确定构造函数、类内初始化程序等。

原文由 bames53 发布,翻译遵循 CC BY-SA 3.0 许可协议

有点hackery,所以只是为了好玩而分享。

 #define with(T, ...)\
    ([&]{ T ${}; __VA_ARGS__; return $; }())

并像这样使用它:

 MyFunction(with(Params,
    $.Name = "Foo Bar",
    $.Age  = 18
));

扩展为:

 MyFunction(([&] {
 Params ${};
 $.Name = "Foo Bar", $.Age = 18;
 return $;
}()));

原文由 keebus 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题