gpt4 book ai didi

c++ - 始终使用 {} 初始化对象是个好习惯吗?

转载 作者:太空狗 更新时间:2023-10-29 19:57:32 32 4
gpt4 key购买 nike

使用新的 {} 语法初始化对象,如下所示:

int a { 123 };

有好处 - 你不会声明一个函数而不是错误地创建一个变量。我什至听说,总是这样做应该是一种习惯。但看看会发生什么:

// I want to create vector with 5 ones in it:
std::vector<int> vi{ 5, 1 }; // ups we have vector with 5 and 1.

那么这是好习惯吗?有没有办法避免这样的问题?

最佳答案

坦率地说,各种初始化技术的微妙之处使得很难说任何一种实践都是“好习惯”。

如评论中所述,Scott Meyers 在Modern Effective C++ 中详细讨论了大括号初始化。他在他的博客上对此事做了进一步的评论,例如herehere .在第二篇博文中,他最终明确表示,他认为 C++ 初始化变幻莫测的泥沼只是糟糕的语言设计。

如 101010 的回答中所述,大括号初始化有好处。在我看来,防止隐式缩小是主要好处。 “最令人烦恼的解析”问题当然是一个真正的好处,但它微不足道——在我看来,在大多数情况下,一个不正确的 int a();而不是 int a;可能会在编译时被捕获。

但至少有两个主要缺点:

  • 在 C++11 和 C++14 中,auto总是推导std::initializer_list来自大括号初始化器。在 C++17 中,如果初始化列表中只有一个元素,则 = 使用,auto推导出该元素的类型; 多个元素的行为没有改变(请参阅上面链接的第二篇博客文章以获得更清晰的解释和示例。)(编辑:如 T.C. 在下面的评论中指出的,我对带有大括号初始化的 C++17auto 规则的理解 仍然 不太正确。)所有这些行为都有些令人惊讶,并且(在我和 Scott Meyers 看来)令人讨厌和困惑.
  • 101010 列出的第三个好处,即初始化列表构造函数优于所有其他构造函数,这实际上是缺点也是优点。您已经提到 std::vector<int> vi{ 5, 1 }; 的行为令熟悉 vector 的人感到惊讶的旧二元素构造函数。 Scott Meyers 在 Effective Modern C++ 中列出了一些其他示例。就个人而言,我发现这比 auto 更糟糕扣除行为(我通常只使用 auto 进行复制初始化,这使得第一个问题很容易避免)。

编辑:事实证明,愚蠢的编译器实现决策有时可能是 another reason to use brace-initialization (虽然实际上 #undef 方法可能更正确)。

关于c++ - 始终使用 {} 初始化对象是个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33444814/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com