mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2024-12-25 20:30:21 +08:00
chore: tune the express
This commit is contained in:
parent
cb23d19dba
commit
a2296112ea
@ -216,9 +216,9 @@ std::vector<int> v2{10, 20}; //使用std::initializer_list构造函数
|
||||
|
||||
这里的暗语是如果一个类没有`std::initializer_list`构造函数,然后你添加一个,用户代码中如果使用括号初始化,可能会发现过去被决议为非`std::initializer_list`构造函数而现在被决议为新的函数。当然,这种事情也可能发生在你添加一个函数到那堆重载函数的时候:过去被决议为旧的重载函数而现在调用了新的函数。`std::initializer_list`重载不会和其他重载函数比较,它直接盖过了其它重载函数,其它重载函数几乎不会被考虑。所以如果你要加入`std::initializer_list`构造函数,请三思而后行。
|
||||
|
||||
第二个,作为一个类库使用者,你必须认真的在花括号和小括号之间选择一个来创建对象。大多数开发者都使用其中一种作为默认情况,只有当他们不能使用这种的时候才会考虑另一种。如果使用默认使用花括号初始化,会得到大范围适用面的好处,它禁止变窄转换,免疫C++最令人头疼的解析。他们知道在一些情况下(比如给一个容器大小和一个值创建`std::vector`)要使用小括号。如果默认使用小括号初始化,它们能和C++98语法保持一致,它避开了`auto`自动推导`std::initializer_list`的问题,也不会不经意间就调用了`std::initializer_list`构造函数。他们承认有时候只能使用花括号(比如创建一个包含着特定值的容器)。关于花括号和小括号的使用没有一个一致的观点,所以我的建议是用一个,并坚持使用。
|
||||
第二个,作为一个类库使用者,你必须认真的在花括号和小括号之间选择一个来创建对象。大多数开发者都使用其中一种作为默认情况,只有当他们不能使用这种的时候才会考虑另一种。如果使用默认使用花括号初始化,会得到大范围适用面的好处,它禁止变窄转换,免疫C++最令人头疼的解析。他们知道在一些情况下(比如给一个容器大小和一个值创建`std::vector`)要使用小括号。如果默认使用小括号初始化,它们能和C++98语法保持一致,它避开了自动推导`std::initializer_list`的问题,也不会不经意间就调用了`std::initializer_list`构造函数。他们承认有时候只能使用花括号(比如创建一个包含着特定值的容器)。关于花括号和小括号的使用没有一个一致的观点,所以我的建议是选择一个方法并遵守它。
|
||||
|
||||
如果你是一个模板的作者,花括号和小括号创建对象就更麻烦了。通常不能知晓哪个会被使用。举个例子,假如你想创建一个接受任意数量的参数,然后用它们创建一个对象。使用可变参数模板(*variadic template*)可以非常简单的解决:
|
||||
如果你是一个模板的作者,花括号和小括号创建对象就更麻烦了。通常不能知晓哪个会被使用。举个例子,假如你想创建一个接受任意数量的参数来创建的对象。使用可变参数模板(*variadic template*)可以非常简单的解决:
|
||||
|
||||
````cpp
|
||||
template<typename T, //要创建的对象类型
|
||||
|
Loading…
Reference in New Issue
Block a user