Update item7.md

This commit is contained in:
猫耳堀川雷鼓 2021-03-02 12:10:56 +08:00 committed by GitHub
parent caad38385d
commit f25c878636
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -44,7 +44,7 @@ std::vector<int> v{ 1, 3, 5 }; //v初始内容为1,3,5
括号初始化也能被用于为非静态数据成员指定默认初始值。C++11允许"="初始化不加花括号也拥有这种能力:
````cpp
class Widget{
...
private:
int x{ 0 }; //没问题x初始值为0
@ -95,7 +95,7 @@ class Widget {
public:
Widget(int i, bool b); //构造函数未声明
Widget(int i, double d); //std::initializer_list形参
...
};
Widget w1(10, true); //调用第一个构造函数
Widget w2{10, true}; //也调用第一个构造函数
@ -109,7 +109,7 @@ public:
Widget(int i, bool b); //同上
Widget(int i, double d); //同上
Widget(std::initializer_list<long double> il); //新添加的
...
};
````
`w2`和`w4`将会使用新添加的构造函数构造,即使另一个非`std::initializer_list`构造函数对于实参是更好的选择:
@ -137,7 +137,7 @@ public:
Widget(int i, double d); //同之前一样
Widget(std::initializer_list<long double> il); //同之前一样
operator float() const; //转换为float
...
};
Widget w5(w4); //使用小括号,调用拷贝构造函数
@ -157,7 +157,7 @@ public:
Widget(int i, bool b); //同之前一样
Widget(int i, double d); //同之前一样
Widget(std::initializer_list<bool> il); //现在元素类型为bool
... //没有隐式转换函数
//没有隐式转换函数
};
Widget w{10, 5.0}; //错误!要求变窄转换
@ -173,7 +173,7 @@ public:
Widget(int i, double d); //同之前一样
//现在std::initializer_list元素类型为std::string
Widget(std::initializer_list<std::string> il);
... //没有隐式转换函数
//没有隐式转换函数
};
Widget w1(10, true); // 使用小括号初始化,调用第一个构造函数
@ -190,7 +190,7 @@ public:
Widget(); //默认构造函数
Widget(std::initializer_list<int> il); //std::initializer_list构造函数
... //没有隐式转换函数
//没有隐式转换函数
};
Widget w1; //调用默认构造函数
@ -226,7 +226,7 @@ template<typename T, //要创建的对象类型
void doSomeWork(Ts&&... params)
{
create local T object from params...
...
}
````
在现实中我们有两种方式实现这个伪代码(关于`std::forward`请参见[Item25](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/5.RRefMovSemPerfForw/item25.md)
@ -237,7 +237,7 @@ T localObject{std::forward<Ts>(params)...}; //使用花括号
考虑这样的调用代码:
````cpp
std::vector<int> v;
...
doSomeWork<std::vector<int>>(10, 20);
````
如果`doSomeWork`创建`localObject`时使用的是小括号,`std::vector`就会包含10个元素。如果`doSomeWork`创建`localObject`时使用的是花括号,`std::vector`就会包含2个元素。哪个是正确的`doSomeWork`的作者不知道,只有调用者知道。