总是用{}初始化对象是个好习惯吗?

斯拉瓦

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

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.

那是好习惯吗?有办法避免这种问题吗?

凯尔·斯特兰德(Kyle Strand)

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

正如评论中提到的那样,Scott Meyers详细讨论了现代有效C ++中的括号初始化他在自己的博客(例如此处此处)上对此事作了进一步评论在第二篇文章中,他最后明确地说,他认为C ++初始化变幻莫测的原因仅仅是糟糕的语言设计。

如101010的答案所述,括号初始化有很多好处。我认为,防止隐式缩小是主要好处。“最令人头疼的解析”问题当然是真正的好处,但这只是微不足道的-在我看来,在大多数情况下,编译时会发现错误int a();而不是错误int a;

但是至少有两个主要缺点:

  • 在C ++ 11和C ++ 14中,auto总是std::initializer_list从大括号初始化器中得出。在C ++中17,如果有在初始化列表只有一个元素是,并且=使用的,auto推断元素的类型; 多个元素的行为是不变(见上面链接了一个清楚的解释,举例第二博客文章。)(编辑:在下面,我的理解评论通过TC指出,C++17规则auto与括号初始化仍然不够所有这些行为都有些令人惊讶,并且(按照我和斯科特·迈耶斯的观点)令人烦恼和困惑。
  • 101010列出的第三个好处是,初始化列表构造函数比其他所有构造函数都更受青睐,这实际上是一个弊端,也是一个好处。您已经提到过,的行为对于std::vector<int> vi{ 5, 1 };熟悉vector老式两元素构造函数的人来说是令人惊讶的斯科特·迈耶斯(Scott Meyers)列举了有效现代C ++中的其他示例就个人而言,我发现这甚至比auto推导行为还差(我通常只auto与拷贝初始化一起使用,这使得第一个问题很容易避免)。

编辑:事实证明,愚蠢的编译器实现决策有时可能是使用括号初始化的另一个原因(尽管实际上该#undef方法可能更正确)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该总是初始化视图模型对象吗?

来自分类Dev

我应该总是初始化视图模型对象吗?

来自分类Dev

在准备转场方法中初始化 ViewController 是一个好习惯吗?

来自分类Dev

为什么用大括号init初始化对象是合法的,即使它不是聚合的?

来自分类Dev

在每个新请求上初始化一个新的httpClient是一个好习惯吗

来自分类Dev

用逗号相互初始化吗?

来自分类Dev

用逗号相互初始化吗?

来自分类Dev

初始化总是应该使用相同的内存块吗?

来自分类Dev

C ++包含关系-总是需要初始化列表吗?

来自分类Dev

用匿名对象初始化字典

来自分类Dev

用块初始化对象

来自分类Dev

用数组,JavaScript初始化对象

来自分类Dev

用值初始化Properties对象

来自分类Dev

用数组,JavaScript初始化对象

来自分类Dev

用异步请求初始化对象

来自分类Dev

用值初始化Properties对象

来自分类Dev

用初始化的对象填充 ArrayList

来自分类Dev

在C ++中,用字符串文字初始化char数组是一个好习惯吗?

来自分类Dev

EXE总是可以用COM替换吗?

来自分类Dev

用Textview代替Viewer作为分隔符是个好习惯吗

来自分类Dev

用初始化的父对象创建一个子类对象

来自分类Dev

在Kotlin android中使用Companion对象是一个好习惯吗?

来自分类Dev

用Java完全初始化不可变对象后,它们会被发布吗?

来自分类Dev

在属性内执行初始化是一种好习惯吗?

来自分类Dev

在头文件中初始化类的成员变量是一种好习惯吗?

来自分类Dev

用C ++初始化另一个对象

来自分类Dev

用参数初始化另一个类构造函数中的对象

来自分类Dev

c# SDK 用多个对象初始化一个接口

来自分类Dev

用类的现有对象初始化对象

Related 相关文章

热门标签

归档