MyClass a1 {a}; // clearer and less error-prone than the other three
MyClass a2 = {a};
MyClass a3 = a;
MyClass a4(a);
为什么?
原文由 Oleksiy 发布,翻译遵循 CC BY-SA 4.0 许可协议
MyClass a1 {a}; // clearer and less error-prone than the other three
MyClass a2 = {a};
MyClass a3 = a;
MyClass a4(a);
为什么?
原文由 Oleksiy 发布,翻译遵循 CC BY-SA 4.0 许可协议
关于使用列表初始化的优点已经有了很好的答案,但是我个人的经验法则是尽可能不要使用花括号,而是让它依赖于概念含义:
一方面,这样我总是确定对象被初始化,不管它是一个“真实的”类,它有一个无论如何都会被调用的默认构造函数,还是一个内置/POD类型。其次,在大多数情况下,它与第一条规则一致,因为默认初始化对象通常表示“空”对象。
根据我的经验,这个规则集可以比默认使用花括号更一致地应用,但是当它们不能被使用或具有与带括号的“正常”函数调用语法不同的含义时,必须明确记住所有异常(调用不同的重载)。
例如,它非常适合标准库类型,例如 std::vector
:
vector<int> a{10, 20}; //Curly braces -> fills the vector with the arguments
vector<int> b(10, 20); //Parentheses -> uses arguments to parametrize some functionality,
vector<int> c(it1, it2); //like filling the vector with 10 integers or copying a range.
vector<int> d{}; //empty braces -> default constructs vector, which is equivalent
//to a vector that is filled with zero elements
原文由 MikeMB 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
基本上是从 Bjarne Stroustrup 的 “The C++ Programming Language 4th Edition” 复制和粘贴:
列表初始化 不允许缩小 (§iso.8.5.4)。那是:
例子:
= 优于 {} 的 唯一 情况是使用
auto
关键字来获取由初始化程序确定的类型。例子:
结论
除非您有充分的理由不这样做,否则首选 {} 初始化而不是替代方法。