From 09e4fbe69e50e816206abd63b13b2b42aa0a4b25 Mon Sep 17 00:00:00 2001 From: yekunxu <130904770+yekunxu@users.noreply.github.com> Date: Sun, 16 Apr 2023 04:23:57 -0700 Subject: [PATCH] Update item8.md Missing * --- src/3.MovingToModernCpp/item8.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3.MovingToModernCpp/item8.md b/src/3.MovingToModernCpp/item8.md index 223bc88..7a90f4f 100644 --- a/src/3.MovingToModernCpp/item8.md +++ b/src/3.MovingToModernCpp/item8.md @@ -110,7 +110,7 @@ auto result3 = lockAndCall(f3, f3m, nullptr); //没问题 第二个使用`NULL`调用的分析也是一样的。当`NULL`被传递给`lockAndCall`,形参`ptr`被推导为整型(译注:由于依赖于具体实现所以不一定是整数类型,所以用整型泛指`int`,`long`等类型),然后当`ptr`——一个`int`或者类似`int`的类型——传递给`f2`的时候就会出现类型错误,`f2`期待的是`std::unique_ptr`。 -然而,使用`nullptr`是调用没什么问题。当`nullptr`传给`lockAndCall`时,`ptr`被推导为`std::nullptr_t`。当`ptr`被传递给`f3`的时候,隐式转换使`std::nullptr_t`转换为`Widget`,因为`std::nullptr_t`可以隐式转换为任何指针类型。 +然而,使用`nullptr`是调用没什么问题。当`nullptr`传给`lockAndCall`时,`ptr`被推导为`std::nullptr_t`。当`ptr`被传递给`f3`的时候,隐式转换使`std::nullptr_t`转换为`Widget*`,因为`std::nullptr_t`可以隐式转换为任何指针类型。 模板类型推导将`0`和`NULL`推导为一个错误的类型(即它们的实际类型,而不是作为空指针的隐含意义),这就导致在当你想要一个空指针时,它们的替代品`nullptr`很吸引人。使用`nullptr`,模板不会有什么特殊的转换。另外,使用`nullptr`不会让你受到同重载决议特殊对待`0`和`NULL`一样的待遇。当你想用一个空指针,使用`nullptr`,不用`0`或者`NULL`。