Mar*_*ing 2 c++ initializer-list c++11
使用{}而不是()在构造函数中允许我在头文件中使用特定构造函数初始化类成员,如下所示:
class X {
private:
std::vector y{1, 2, 3};
};
Run Code Online (Sandbox Code Playgroud)
但是,我如何知道对于Z我使用的类Z z{a, b};将调用具有两个参数的构造函数Z::Z(int a, int b)- 而不是具有std::initializer_list?的那个?
我的意思是std::complex(1, 2)和std::complex{1, 2}是相同的,但std::vector(3)与std::vector{3}肯定不是.
除非我需要,我是否应该总是使用{}变体或使用?(){}
这是一个可以涵盖整本书章节的主题.请参阅Scott Meyers 最近的草案项目引用他即将推出的有效的现代C++(为了清晰而重新格式化):
大多数开发人员最终选择一种分隔符作为默认设置,仅在必要时使用另一种分隔符.
Braces-by-default人们被广泛的适用性,他们防止缩小转换以及避免C++ 最令人烦恼的解析所吸引.这些人理解在某些情况下(例如,创建
std::vector具有给定大小和初始元素值的a),需要括号.相反,go-parentheses-go crowd将括号作为默认参数分隔符.他们被C++ 98语法传统的一致性所吸引,它避免了 自动推导出的
std::initializer_list问题,并且他们的对象创建调用的知识不会被构造函数无意地拖延std::initializer_list.他们承认有时只会使用大括号(例如,在创建具有特定值的容器时).这两种方法都没有比另一种方法更好.我的建议是选择一个并始终如一地应用它.
| 归档时间: |
|
| 查看次数: |
1464 次 |
| 最近记录: |