mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2024-12-28 22:00:55 +08:00
commit
7a396102e3
@ -16,7 +16,7 @@ int x;
|
||||
|
||||
别介意,让我们转换一个话题, 对一个局部变量使用解引用迭代器的方式初始化:
|
||||
````cpp
|
||||
template<typename T>
|
||||
template<typename It>
|
||||
void dwim(It b, It e)
|
||||
{
|
||||
while(b!=e){
|
||||
@ -136,4 +136,4 @@ for(const auto & p : m)
|
||||
记住
|
||||
|
||||
+ auto变量必须初始化,通常它可以避免一些移植性和效率性的问题,也使得重构更方便,还能让你少打几个字。
|
||||
+ 正如Item2和6讨论的,auto类型的变量可能会踩到一些陷阱。
|
||||
+ 正如Item2和6讨论的,auto类型的变量可能会踩到一些陷阱。
|
||||
|
@ -92,15 +92,15 @@ double calEpsilon();
|
||||
````cpp
|
||||
float ep = calEpsilon();
|
||||
````
|
||||
但是这几乎就是在说“我故意减少函数返回值的精度”。使用显式类型初始器惯用法我们可以这样:
|
||||
但是这几乎没有表明“我确实要减少函数返回值的精度”。使用显式类型初始器惯用法我们可以这样:
|
||||
````cpp
|
||||
auto ep = static_cast<float>(calEpsilon());
|
||||
````
|
||||
同样的原因如果你想有一个浮点表达式,你故意的用int存储你也可以使用这个惯用法。假如你需要计算一个随机访问迭代器(比如std::vector,std::deque,std::array)中某元素的下标,你给它一个0.0到1.0的值表明这个元素离容器的头部有多远(0.5意味着位于容器中间)。进一步假设你很自信结果下标是int。如果容器是c,d是double类型变量,你可以用这样的方法计算容器下标:
|
||||
处于同样的原因,如果你故意想用int类型存储一个表达式返回的float类型的结果,你也可以使用这个方法。假如你需要计算一个随机访问迭代器(比如std::vector,std::deque,std::array)中某元素的下标,你给它一个0.0到1.0的值表明这个元素离容器的头部有多远(0.5意味着位于容器中间)。进一步假设你很自信结果下标是int。如果容器是c,d是double类型变量,你可以用这样的方法计算容器下标:
|
||||
````cpp
|
||||
int index = d * c.size();
|
||||
````
|
||||
但这里你故意把double转化为右边的int使这段代码表意不明,显式类型初始器可以帮助你正确表意:
|
||||
但是这种写法并没有明确表明你想将右侧的double类型转换成int类型,显式类型初始器可以帮助你正确表意:
|
||||
````cpp
|
||||
auto index = static_cast<int>(d * size());
|
||||
````
|
||||
@ -108,4 +108,4 @@ auto index = static_cast<int>(d * size());
|
||||
记住
|
||||
|
||||
+ 不可见的代理类可能会使auto从表达式中推导出“错误的”类型
|
||||
+ 显式类型初始器惯用法强制auto推导出你想要的结果
|
||||
+ 显式类型初始器惯用法强制auto推导出你想要的结果
|
||||
|
Loading…
Reference in New Issue
Block a user