{}值进行初始化
int j{}; //j = 0;
int *p{}; //p = nullptr;
{}不允许窄化初始化
int j {5.3} // warning的原因是占的字节变小了,还是精度变小了?
char c{999} //waring 999 > 256
int j(5.3) //OK,不属于initializer list
explicit修饰构造函数,不允许隐式转换,构造函数的参数可以为多个。
class p {
p(int a, int b) {...}
p(initializer_list<int> values) {...}
explicit p(int a, int b, int c) {...}
}
p p1{1,2,3}; //OK
p p2 = {1, 2, 3}; //error, use explicit p::p(int a, int b, int c)
p p3 ({1,2,3}); //error, convert p from initializer list use explicit p::p(int a, int b, inc)
std::initializer_list<>
C++11提供这种类模板std::initializer_list<>
void print(std::initializer_list<int> values) {
for(auto p = values.begin(); p != values.end(); p++) {
std::cout << *p << "\n"
}
}
print({1,2,3,4});
initializer list是通过模板类array来实现
容器array的代码,从代码中可以看到<>不仅仅可以传输数据类型,还是传输数据参数。
template<typename _Tp, std::size_t _Num>
stuct array {
typename _Tp value_type;
typename _Tp* pointer;
typename value_type* iterator;
value_type _M_instance[_Num:_Num?1]
iterator begin() {
return iterator(&_M_instance[0]);
}
iterator end() {
return iterator(&_M_instance[_Num]);
}
}