使用新的{}语法初始化对象,如下所示:
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.
那是好习惯吗?有办法避免这种问题吗?
坦白地说,各种初始化技术的微妙之处使得很难说任何一种实践都是“好习惯”。
正如评论中提到的那样,Scott Meyers详细讨论了现代有效C ++中的括号初始化。他在自己的博客(例如此处和此处)上对此事作了进一步评论。在第二篇文章中,他最后明确地说,他认为C ++初始化变幻莫测的原因仅仅是糟糕的语言设计。
如101010的答案所述,括号初始化有很多好处。我认为,防止隐式缩小是主要好处。“最令人头疼的解析”问题当然是真正的好处,但这只是微不足道的-在我看来,在大多数情况下,编译时会发现错误int a();
而不是错误int a;
。
但是至少有两个主要缺点:
auto
总是std::initializer_list
从大括号初始化器中得出。在C ++中17,如果有在初始化列表只有一个元素是,并且=
是不使用的,auto
推断元素的类型; C++17
规则auto
与括号初始化仍然不够所有这些行为都有些令人惊讶,并且(按照我和斯科特·迈耶斯的观点)令人烦恼和困惑。std::vector<int> vi{ 5, 1 };
熟悉vector
老式两元素构造函数的人来说是令人惊讶的。斯科特·迈耶斯(Scott Meyers)列举了有效现代C ++中的其他示例。就个人而言,我发现这甚至比auto
推导行为还差(我通常只auto
与拷贝初始化一起使用,这使得第一个问题很容易避免)。编辑:事实证明,愚蠢的编译器实现决策有时可能是使用括号初始化的另一个原因(尽管实际上该#undef
方法可能更正确)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句