为什么建议统一初始化(用牙套初始化)
Why uniform initialization (initialization with braces) is recommended?
我看到了许多不同的位置,建议使用统一的初始化。Herb Sutter推荐它,并在使用不是时提供列表。似乎一般共识是使用此语法。
但是,我不明白为什么。它具有std::initializer_list
的问题。将std::initializer_list
添加到类中可以破坏代码。使用模板,不建议使用。似乎比"旧"方式更有例外。这些问题都不存在于旧方法。
我看不出为什么统一初始化是优越的。我的结论是继续使用()
语法,并在我想用std::initializer_list
调用构造函数的情况下使用{}
。
为什么?统一初始化给出了什么?
- 禁止缩小:良好的功能。但是,由于我已经缩小警告为 all 我的代码(因为我想知道代码中的所有狭窄,而不仅仅是初始化),所以我不需要此功能太多。
- 最烦人的解析:是的,这是一个问题,但是我很少打入这个问题。因此,这不是(我)切换的原因。在这个地方,我可以使用
{}
。 - 还有其他东西(也许我仍在学习C 的新功能)?
使用"旧"方式,没有任何规则要记住,也没有可能的编码。只需使用它,有时很少使用它,您就会击中最烦人的解析。仅此而已。
我在某个地方有错误的想法吗?
看来,您对技术方面有一个不错的看法,nwp
在评论中提出了我要提到的另一个问题。因此,我认为您有做出决定所需的信息。
也就是说,我认为值得一提,并试图强调清晰度的重要性。以我的经验,代码清晰度可能是在代码库中维护的最重要的事情。特别是在避免混乱和限制时间浪费时间上。我认为我们所有人都有花费太长的经验来调整一件货物代码的流程,以最终发现问题是对原始意图的错别字或误解。
公平地说,听起来您试图通过坚持有助于解决这个问题的样式和工具来解决这个问题。正如nwp
所开始的那样,标准参数是,许多人不偏离语言内置的命名约定,也不使用IDE。我个人同情这种逻辑,但也明白了为什么许多人无视它是老式的,甚至是非问题(尤其是对于IDE的情况)。
当涉及到清晰的问题时,我发现很难牢记人们即使在可能会帮助他们的情况下也很烦人地忽略次要细节。因此,可以暗示问题可能更好的上下文线索。语法突出显示很棒,但是我不会打赌一个晚上调试,能够注意到某些东西是黄色而不是橙色的。黄色并使用骆驼例?或许。黄色并使用牙套?也许。
尤其是当您开始涉及其他人写的代码时,或者很久以前,所有这些小提示就越来越重要。
在一天结束时,我认为这就是为什么人们喜欢它来推荐它的原因。这是一种重要的事情,可能会在您身上伸出来。
另外,响应您对缩小的评论的旁注。启用警告以进行缩小的警告可能使您目前可以忽略此收益某些情况,并将警告视为滋扰。但是,在两种情况下都采用列表初始化可以不仅有助于防止潜在问题,而且还可以明确指定代码。
要达到这一点,人们都有不同的情况和偏好。像这样的功能增加了人们可以提高代码质量/可读性的方式,同时仍在他们可能拥有的任何约束中工作(自我强加或其他)。
- 为什么在C++中首先初始化成员类
- (C++)为什么静态成员可以在初始化之前使用
- 为什么用结构初始化数组需要指定结构名称
- 为什么std::vector和std::valarray初始化构造函数不同
- 为什么这种直接初始化有效?(C++17)
- 为什么 zlib 放气初始化调用一次不起作用?
- 为什么C++常量模板化向量在使用之前没有初始化?
- 为什么C++有不同的变量初始化方式?
- 为什么除了继承聚合结构之外,结构为空,无法聚合初始化?
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- 为什么我在初始化带大括号的结构时出错?
- 为什么thread_local变量在这里从未初始化?
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 为什么初始化时没有调用重载赋值运算符?
- 为什么通过指针编译时不能分配 const 初始化
- 为什么 gcc 会给我可能未初始化的警告 deque::insert 带有过滤范围
- 为什么我的 c++ 程序检查不是初始化的变量?
- 复制初始化:为什么即使关闭了复制省略,也没有调用move或copy构造函数
- 'goto label'跳过了'unused'的初始化 - 为什么我为 std::string 获取它而不是 int?