<Effective Mordern C++>笔记:Item 8:prefer nullptr to 0 and NULL.
2017-05-11 19:32
716 查看
虽然如果C++看到一个指针类型被定义为0,它会把0解析为一个空指针,但是
在一些接受不同参数类型的重载函数中,如下:
而如果调用f(NULL),则其含义是不清晰的,如果NULL被定义为
最后需要明确的是,一个
这样的一个模板函数,可以看到第一个参数是一个函数类型,第二个应该传入指针类型、
0终究只是个
int类型并不是个指针。
NULL也是一样的,它也被允许解析为非
int型的整形,但不是一个指针类型。
在一些接受不同参数类型的重载函数中,如下:
void f(int); void f(bool); void f(void*); f(0); // 调用f(int), 而不是f(void*) f(NULL); //可能会编译错误,但一般调用f(0),不可能调用f(void*)
而如果调用f(NULL),则其含义是不清晰的,如果NULL被定义为
0L,因为
long类型可转化为
int,
bool和
void*都是可以的,这样模棱两可的问题直到C++11定义了
nullptr才被解决,有着更清晰的语义,同样也不会有这样的困扰,因为
nullptr不是一个整形,但是准确的说,它也不是一个确定的指针类型,可以把它理解为任意类型的指针,它的准确类型是
std::nullptr_t,一个可以隐式转换为任意指针类型的类型。用
nullptr代替
NULL和
0,可以使得重载函数的调用明确。
最后需要明确的是,一个
int类型可以转化为
NULL,但是
nullptr不能由
int类型转化而来,必须是一个指针类型。
template<typename FuncType, typename MuxType, typename PtrType> //decltype(auto)是C++14的用法 decltype(auto) lockAndCall(FuncType func, MuxType& mutex, PtrType ptr) { MuxGuard g(mutex); return func(ptr); }
这样的一个模板函数,可以看到第一个参数是一个函数类型,第二个应该传入指针类型、
//声明这么一个函数 void f(void*); lockAndCall(f,0);//编译失败,0不能转化为void* lockAndCall(f,NULL);//同上 lockAndCall(f,nullptr);//成功
相关文章推荐
- <Effective Mordern C++>笔记:Item 5:Prefer auto to explicit type declarations.
- <Effective Mordern C++>笔记:Item 9:prefer alias declarations to typedefs.
- <Effective Mordern C++>笔记:Item 3:Understand decltype .
- <Effective Mordern C++>笔记:Item 2:Understand auto type deduction.
- <Effective Mordern C++>笔记:Item 4:Knowing how to view deduced types .
- <Effective C++>:Item 20:以pass-by-reference-to-const替代pass-by-value .
- <Effective Mordern C++>Item 6:UseTheExplicitlyTypedInitializerIdiomWhenAutoDeducesUndesiredTypes
- (大卫的阅读笔记)More Effective C++ Item 附2:一个auto_ptr的实现实例
- Effective C++ Item 18 Make interfaces easy to use correctly and hard to use incorrectly
- <Effective Modern C++>Item 18: Use std::unique_ptr for exclusive-ownership resource management.
- <Effective C++> Item 29:争取异常安全的代码
- effective C++ Item 2: Prefer consts, enums, and inlines to #defines
- <Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数
- Item8 Prefer nullptr to 0 and NULL
- Effective C++ Item 2:Prefer constS, enumS, and inlineS to #defineS
- <Effective C++>:Item25:考虑写出一个不抛出异常的swap函数
- <<Effective c++>>读书笔记---条款20:宁以pass-by-reference-to-const替换pass-by-value
- <More Effective C++>笔记--技巧
- Effective Modern C++ : Item 8 -> 优先选择nullptr而不是0和NULL
- Effective C# Item 2: Prefer readonly to const