【问题标题】:C++ Discussion: Use of =, {}, and () as initializers, Which one should I use?C++ 讨论:使用 =、{} 和 () 作为初始化程序,我应该使用哪一个?
【发布时间】:2020-07-17 12:52:03
【问题描述】:

在阅读 isocpp 的 C++ 核心指南时,我浏览了 this 部分。我已经在迄今为止阅读的一些 C++ 代码中看到了这些方法。例如:() 已在初始化构造函数初始化列表中的数据字段时使用,即使对于 primitive 类型,我也看到它在本地使用。有些人使用{} 来初始化变量。而其他人则使用此=。我不知道他们之间有什么区别。我的意思是它们是否实现了相同的目标,只是风格不同,或者它们具有不同的含义。谁能解释一下!

【问题讨论】:

  • Nicolai Josuttis 在 YouTube 上的 C++Now 2018 上就​​该主题发表了闭幕主题演讲。
  • 不幸的是,在哪种情况下使用哪种样式没有普遍共识:(

标签: c++ initialization cpp-core-guidelines


【解决方案1】:

您可能对有关此主题的录音讨论感兴趣 - 近期在 C++(11 及更高版本)中使统一初始化“工作”的历史:

CppCon 2018: Nicolai Josuttis “The Nightmare of Initialization in C++”

演讲结束时的一些片段:

  • Google 在他们的 Abseil 倡议中拒绝尝试将人们“转换”为一致使用花括号初始化。因此,当初始化主动应用某些逻辑时,他们坚持采用/推荐 equals 进行“直接”初始化和括号。 Nicolai 不赞成这种做法。
  • Nicolai 建议:努力改变我们的习惯,更喜欢花括号初始化。现在比以前好多了。

PS - 这个演讲可能也很有趣:

Core C++ 2019 :: Timur Doumler :: Initialisation in modern C++

更多的是调查不同类型初始化的复杂性(而且有很多!)

【讨论】:

  • 如何在初始化后使用此语法为变量赋值。我试过a = {2},但这似乎很乱,但是,它有效。有没有更好的办法。
【解决方案2】:

= 和初始化器中的大括号之间的区别几乎不存在。如果您遇到了差异,那么您正在做一些奇怪的事情或在 C++14 之前的编译器上。

{}()的主要区别在于{}不进行隐式转换,比如非explicit转换构造函数和转换运算符,在有符号和无符号类型之间切换,以及扩大或缩小整数和浮点宽度。因此,我听到的一般建议是尽可能首选{},以避免意外的类型转换。

【讨论】:

    【解决方案3】:

    大括号 {} 的通用用法是作为 C++11 标准的一部分引入的。这里的重要属性是 {} 初始化不允许缩小转换。例如

    double d = 1.7789856453427678;
    int a{d}; //Compile time error - value of d will not fit in a
    int a(d); //ok - a is 1
    int a = d; //ok - a is 1
    

    因此,大括号 {} 初始化是编写更健壮代码的首选方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多