2017-09-25 76 views
7

我看到很多不同的地方统一初始化是recommended。草药Sutter recommends它,并给出了当不是使用它的列表。看来普遍的共识是使用这种语法。为什么建议统一初始化(使用大括号初始化)?

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

我看不出为什么统一初始化更好。我的结论是继续使用()语法,并在当我想调用构造与std::initializer_list的情况下使用{}

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

  • 禁止缩小:很好的功能。但是,由于我缩小了警告,所以我的代码打开了全部(因为我想知道我的代码中的所有缩小,而不仅仅是初始化),所以我不需要太多这个功能。
  • 最令人头疼的解析:是的,这是一个问题,但我非常少见。所以这不是一个理由(对我来说)切换。这个地方,我可以用{}
  • 还有什么(也许,我还在学习C++的新功能)?

随着“老”的方式,没有规则要记住,没有可能的破解代码。只要使用它,有时候,非常非常罕见的是,您会遇到最令人头疼的解析。就这样。

我的思维错了吗?

+7

它有助于了解什么是功能,什么是对象。 'f(g(),h(j,i));'不如'f(g {},h(i,j));'清楚。当变量具有专有名称时,这仍然很重要。 – nwp

+0

@nwp:yepp,这是一个有效的论点。但是,我有一个命名约定,我可以立即看到类型。此外,当前良好的IDE可以通过某种方式(着色,斜体,无论)显示它们之间的差异。 – geza

+4

您的命名约定不会被STL或其他各种库所遵循。但是,当然,如果用一些外部工具替换支撑初始值设定项的大部分功能并单独工作,或者强迫您周围的人做同样的事情,则不需要它们。并非每个C++功能对每个人都有意义。 – nwp

回答

0

好像你有技术方面的一个体面的保持和nwp提出的其他关注我要提到,清晰度中的注释。所以我认为你有需要做出决定的信息。

这就是说,我认为这是值得倍增,并试图强调清晰度方面的重要性。根据我的经验,代码清晰度可能是维护代码库中最重要的一件事。特别是在避免混淆和限制时间浪费在愚蠢的错误上。我想我们都有过花费太长时间调整一小段代码的流程的经验,最终才发现问题是对最初意图的错误或误解。

公平起见,这听起来像你试图通过坚持一种风格和工具来解决这个问题。标准理由,如nwp开始,很多人不会偏离语言内置的命名约定,也不会使用IDE。我个人对这一逻辑表示同情,但也明白为什么许多人将其视为过时甚至是非问题(特别是对于IDE)。

当涉及到清晰度的问题,不过,我觉得很难不记住,人是在忽略小细节烦人的好,即使他们可能会帮助他们。所以更多的背景线索可以暗示问题可能会更好。语法突出显示效果很好,但我不打赌在调试的某个晚上能够注意到黄色而不是橙色。黄色和使用骆驼案件?也许。黄色和使用大括号?也许。

特别是当你开始进入别人编写的代码或者很久以前,所有这些小小的提示开始变得越重要。

在一天结束时,我认为这就是为什么人们喜欢它足以推荐它。这件事在事情发生的时候可能会贴近你。


此外,一个备注回应你对窄化的评论。为缩小而启用警告可能允许您暂时忽略此优点,但在许多情况下,人们1)由于遗留代码而无法启用此类警告,或2)不希望启用此类警告,因为它们故意依赖此类行为某些情况下,会认为这些警告是令人讨厌的。但是,在任何情况下采用列表初始化都可能有助于防止潜在问题,同时也可以明确指定特定代码行的意图。

为了说明问题,人们都有不同的情况和偏好。像这种增加的方式,人们可以提高他们的代码质量/可读性,同时仍然可以在他们可能有的任何限制(自行强加或以其他方式)内工作。

+0

一般来说,我同意你的看法。我只是没有看到这个问题。在很多情况下,“a()”是函数调用还是构造函数都无关紧要。两者都“返回”一个对象。我在这里唯一接受的是''''可以帮助更好地理解代码。但是当你试图理解别人的代码时,你最好使用它的工具。例如,使用调试器,您可以更轻松地执行代码所需的路径等。您为传统代码启用警告的要点绝对有效。 – geza

+0

所以是的,有不同的情况,偏好。这就是为什么我觉得'{}'被认为是优越的东西,而一般的建议是:“使用它”。在我看来,这个建议必须改变成更复杂的东西。 – geza

+0

@geza我想这就是建议。我倾向于把这样的建议看作是暗示“如果你没有理由不这样做”。通常我认为人们在明确包含这些免责声明时很谨慎,以防新程序员可能使用该逻辑来写出有用的功能。此外,特别是对于像C++这样的语言,我认为人们倾向于支持让编译器为您做额外工作的功能,并相信您会在继续之前了解错误的真正含义,并将其视为净效益在那光。 – thesquaregroot