这段代码在概念上为三个指针做了同样的事情(安全指针初始化):
int* p1 = nullptr;
int* p2 = NULL;
int* p3 = 0;
那么,与赋值NULL
或0
相比,为指针赋值nullptr
有什么优势呢
发布于 2012-12-11 21:48:46
这里真正的动机是完美的转发。
考虑一下:
void f(int* p);
template<typename T> void forward(T&& t) {
f(std::forward<T>(t));
}
int main() {
forward(0); // FAIL
}
简单地说,0是一个特殊的值,但是值不能通过系统传播-只有类型可以。转发函数是必不可少的,0不能处理它们。因此,引入nullptr
是绝对必要的,其中类型是特殊的,并且类型确实可以传播。事实上,MSVC团队在实现了rvalue引用之后,不得不提前引入nullptr
,然后自己发现了这个陷阱。
在其他一些情况下,nullptr
可以使工作变得更容易-但它不是核心情况,因为cast可以解决这些问题。考虑一下
void f(int);
void f(int*);
int main() { f(0); f(nullptr); }
调用两个单独的重载。此外,请考虑
void f(int*);
void f(long*);
int main() { f(0); }
这是不明确的。但是,使用nullptr,您可以提供
void f(std::nullptr_t)
int main() { f(nullptr); }
发布于 2012-12-11 16:52:33
正如其他人已经说过的,它的主要优势在于重载。虽然显式int
和指针重载的情况很少见,但考虑一下像std::fill
这样的标准库函数(它在C++03中不止一次让我头疼):
MyClass *arr[4];
std::fill_n(arr, 4, NULL);
不能编译:Cannot convert int to MyClass*
。
发布于 2012-12-11 16:54:04
IMO比这些重载问题更重要:在深度嵌套的模板构造中,很难不跟踪类型,并且给出显式签名是一项相当大的努力。因此,对于您使用的任何东西,越精确地关注预期的目的越好,这将减少对显式签名的需求,并允许编译器在出现错误时生成更有洞察力的错误消息。
https://stackoverflow.com/questions/13816385
复制相似问题