为什么建议使用统一初始化(使用大括号初始化)?

gez*_*eza 7 c++

我看到很多不同的地方建议使用统一初始化.Herb Sutter 推荐它,并在不使用时列出清单.似乎普遍的共识是使用这种语法.

但是,我不明白为什么.它具有std::initializer_list优先权的问题.添加std::initializer_list到类可能会破坏代码.使用模板时,建议不要使用.它似乎比"旧"方式有更多例外.旧方式不存在这些问题.

我不明白为什么统一初始化是优越的.我的结论是继续使用()语法,并且{} 仅在我想用构造函数调用的情况下使用std::initializer_list.

为什么?统一初始化给出了什么?

  • 禁止缩小:良好的功能.但是,由于我的所有代码都有缩小警告(因为我想知道我的代码中的所有缩小,而不仅仅是初始化),我不需要太多这个功能.
  • 最令人烦恼的解析:是的,这是一个问题,但我非常非常罕见.所以这不是(对我而言)切换的原因.这个地方,我可以使用{}.
  • 还有什么(也许,我还在学习C++的新功能)?

使用"旧"方式,没有要记住的规则,没有可能的代码破坏.只是使用它,有时,非常非常罕见,你打了最令人烦恼的解析.就这样.

我的想法在某处错了吗?

the*_*oot 0

看来您对技术方面有不错的把握,并nwp提出了我在评论中提到的另一个问题,即清晰度。所以我认为您拥有做出决定所需的信息。

也就是说,我认为值得加倍努力并努力强调清晰度方面的重要性。根据我的经验,代码清晰度可能是代码库中维护的最重要的事情。特别是在避免混乱和限制浪费在愚蠢错误上的时间方面。我想我们都有过这样的经历:花了太长时间调整一段有缺陷的代码的流程,最终却发现问题是拼写错误或对初衷的误解。

公平地说,听起来您已经尝试通过坚持有助于解决这个问题的风格和工具来解决这个问题。正如一开始,标准的论点nwp是,许多人不愿意偏离语言内置的命名约定,也不愿意使用 IDE。我个人同情这种逻辑,但也理解为什么许多人认为它过时甚至不是问题(特别是对于 IDE 而言)。

然而,当谈到清晰度问题时,我发现很难不记住,人们总是很容易忽略一些细节,即使这些细节可能对他们有帮助。因此,能够暗示问题所在的上下文线索越多越好。语法突出显示很棒,但我不会打赌一晚上的调试就能注意到黄色而不是橙色的东西。黄色并使用驼峰式大小写?或许。黄色并使用牙套?或许。

尤其是当您开始接触别人编写的代码或很久以前的代码时,所有这些小提示就变得更加重要。

归根结底,我认为这就是人们喜欢它并推荐它的原因。这种事情在重要的时候可能会引起你的注意。


另外,附注回应您关于缩小范围的评论。启用缩小警告可能会让您暂时忽略此好处,但在许多情况下,人们要么 1) 由于遗留代码而无法启用此类警告,要么 2) 不想启用此类警告,因为他们故意依赖于此类行为某些情况下,并会认为这些警告是一种滋扰。然而,在任何一种情况下采用列表初始化不仅可以帮助防止潜在问题,还可以明确给定代码行的意图。

言归正传,每个人都有不同的情况和偏好。像这样的功能增加了人们提高代码质量/可读性的方式,同时仍然在他们可能有的任何限制(自我施加的或其他的)内工作。