首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用nullptr有什么好处?

使用nullptr有什么好处?
EN

Stack Overflow用户
提问于 2012-12-11 16:35:11
回答 3查看 56.5K关注 0票数 169

这段代码在概念上为三个指针做了同样的事情(安全指针初始化):

代码语言:javascript
复制
int* p1 = nullptr;
int* p2 = NULL;
int* p3 = 0;

那么,与赋值NULL0相比,为指针赋值nullptr有什么优势呢

EN

回答 3

Stack Overflow用户

发布于 2012-12-11 21:48:46

这里真正的动机是完美的转发。

考虑一下:

代码语言:javascript
复制
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可以解决这些问题。考虑一下

代码语言:javascript
复制
void f(int);
void f(int*);
int main() { f(0); f(nullptr); }

调用两个单独的重载。此外,请考虑

代码语言:javascript
复制
void f(int*);
void f(long*);
int main() { f(0); }

这是不明确的。但是,使用nullptr,您可以提供

代码语言:javascript
复制
void f(std::nullptr_t)
int main() { f(nullptr); }
票数 24
EN

Stack Overflow用户

发布于 2012-12-11 16:52:33

正如其他人已经说过的,它的主要优势在于重载。虽然显式int和指针重载的情况很少见,但考虑一下像std::fill这样的标准库函数(它在C++03中不止一次让我头疼):

代码语言:javascript
复制
MyClass *arr[4];
std::fill_n(arr, 4, NULL);

不能编译:Cannot convert int to MyClass*

票数 4
EN

Stack Overflow用户

发布于 2012-12-11 16:54:04

IMO比这些重载问题更重要:在深度嵌套的模板构造中,很难不跟踪类型,并且给出显式签名是一项相当大的努力。因此,对于您使用的任何东西,越精确地关注预期的目的越好,这将减少对显式签名的需求,并允许编译器在出现错误时生成更有洞察力的错误消息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13816385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档