mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-17 07:30:09 +08:00
deploy: c70044e107
This commit is contained in:
parent
a7243ba154
commit
d886bb1e2e
@ -232,7 +232,7 @@ auto result3 = lockAndCall(f3, f3m, nullptr); //没问题
|
||||
</code></pre>
|
||||
<p>代码虽然可以这样写,但是就像注释中说的,前两个情况不能通过编译。在第一个调用中存在的问题是当<code>0</code>被传递给<code>lockAndCall</code>模板,模板类型推导会尝试去推导实参类型,<code>0</code>的类型总是<code>int</code>,所以这就是这次调用<code>lockAndCall</code>实例化出的<code>ptr</code>的类型。不幸的是,这意味着<code>lockAndCall</code>中<code>func</code>会被<code>int</code>类型的实参调用,这与<code>f1</code>期待的<code>std::shared_ptr<Widget></code>形参不符。传递<code>0</code>给<code>lockAndCall</code>本来想表示空指针,但是实际上得到的一个普通的<code>int</code>。把<code>int</code>类型看做<code>std::shared_ptr<Widget></code>类型给<code>f1</code>自然是一个类型错误。在模板<code>lockAndCall</code>中使用<code>0</code>之所以失败是因为在模板中,传给的是<code>int</code>但实际上函数期待的是一个<code>std::shared_ptr<Widget></code>。</p>
|
||||
<p>第二个使用<code>NULL</code>调用的分析也是一样的。当<code>NULL</code>被传递给<code>lockAndCall</code>,形参<code>ptr</code>被推导为整型(译注:由于依赖于具体实现所以不一定是整数类型,所以用整型泛指<code>int</code>,<code>long</code>等类型),然后当<code>ptr</code>——一个<code>int</code>或者类似<code>int</code>的类型——传递给<code>f2</code>的时候就会出现类型错误,<code>f2</code>期待的是<code>std::unique_ptr<Widget></code>。</p>
|
||||
<p>然而,使用<code>nullptr</code>是调用没什么问题。当<code>nullptr</code>传给<code>lockAndCall</code>时,<code>ptr</code>被推导为<code>std::nullptr_t</code>。当<code>ptr</code>被传递给<code>f3</code>的时候,隐式转换使<code>std::nullptr_t</code>转换为<code>Widget</code>,因为<code>std::nullptr_t</code>可以隐式转换为任何指针类型。</p>
|
||||
<p>然而,使用<code>nullptr</code>是调用没什么问题。当<code>nullptr</code>传给<code>lockAndCall</code>时,<code>ptr</code>被推导为<code>std::nullptr_t</code>。当<code>ptr</code>被传递给<code>f3</code>的时候,隐式转换使<code>std::nullptr_t</code>转换为<code>Widget*</code>,因为<code>std::nullptr_t</code>可以隐式转换为任何指针类型。</p>
|
||||
<p>模板类型推导将<code>0</code>和<code>NULL</code>推导为一个错误的类型(即它们的实际类型,而不是作为空指针的隐含意义),这就导致在当你想要一个空指针时,它们的替代品<code>nullptr</code>很吸引人。使用<code>nullptr</code>,模板不会有什么特殊的转换。另外,使用<code>nullptr</code>不会让你受到同重载决议特殊对待<code>0</code>和<code>NULL</code>一样的待遇。当你想用一个空指针,使用<code>nullptr</code>,不用<code>0</code>或者<code>NULL</code>。</p>
|
||||
<p><strong>记住</strong></p>
|
||||
<ul>
|
||||
|
@ -1356,7 +1356,7 @@ auto result3 = lockAndCall(f3, f3m, nullptr); //没问题
|
||||
</code></pre>
|
||||
<p>代码虽然可以这样写,但是就像注释中说的,前两个情况不能通过编译。在第一个调用中存在的问题是当<code>0</code>被传递给<code>lockAndCall</code>模板,模板类型推导会尝试去推导实参类型,<code>0</code>的类型总是<code>int</code>,所以这就是这次调用<code>lockAndCall</code>实例化出的<code>ptr</code>的类型。不幸的是,这意味着<code>lockAndCall</code>中<code>func</code>会被<code>int</code>类型的实参调用,这与<code>f1</code>期待的<code>std::shared_ptr<Widget></code>形参不符。传递<code>0</code>给<code>lockAndCall</code>本来想表示空指针,但是实际上得到的一个普通的<code>int</code>。把<code>int</code>类型看做<code>std::shared_ptr<Widget></code>类型给<code>f1</code>自然是一个类型错误。在模板<code>lockAndCall</code>中使用<code>0</code>之所以失败是因为在模板中,传给的是<code>int</code>但实际上函数期待的是一个<code>std::shared_ptr<Widget></code>。</p>
|
||||
<p>第二个使用<code>NULL</code>调用的分析也是一样的。当<code>NULL</code>被传递给<code>lockAndCall</code>,形参<code>ptr</code>被推导为整型(译注:由于依赖于具体实现所以不一定是整数类型,所以用整型泛指<code>int</code>,<code>long</code>等类型),然后当<code>ptr</code>——一个<code>int</code>或者类似<code>int</code>的类型——传递给<code>f2</code>的时候就会出现类型错误,<code>f2</code>期待的是<code>std::unique_ptr<Widget></code>。</p>
|
||||
<p>然而,使用<code>nullptr</code>是调用没什么问题。当<code>nullptr</code>传给<code>lockAndCall</code>时,<code>ptr</code>被推导为<code>std::nullptr_t</code>。当<code>ptr</code>被传递给<code>f3</code>的时候,隐式转换使<code>std::nullptr_t</code>转换为<code>Widget</code>,因为<code>std::nullptr_t</code>可以隐式转换为任何指针类型。</p>
|
||||
<p>然而,使用<code>nullptr</code>是调用没什么问题。当<code>nullptr</code>传给<code>lockAndCall</code>时,<code>ptr</code>被推导为<code>std::nullptr_t</code>。当<code>ptr</code>被传递给<code>f3</code>的时候,隐式转换使<code>std::nullptr_t</code>转换为<code>Widget*</code>,因为<code>std::nullptr_t</code>可以隐式转换为任何指针类型。</p>
|
||||
<p>模板类型推导将<code>0</code>和<code>NULL</code>推导为一个错误的类型(即它们的实际类型,而不是作为空指针的隐含意义),这就导致在当你想要一个空指针时,它们的替代品<code>nullptr</code>很吸引人。使用<code>nullptr</code>,模板不会有什么特殊的转换。另外,使用<code>nullptr</code>不会让你受到同重载决议特殊对待<code>0</code>和<code>NULL</code>一样的待遇。当你想用一个空指针,使用<code>nullptr</code>,不用<code>0</code>或者<code>NULL</code>。</p>
|
||||
<p><strong>记住</strong></p>
|
||||
<ul>
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user