不能直接用nullptr赋值给整数变量,因为nullptr是std::nullptr_t类型,仅隐式转换为指针类型,不转换为整数;而0和NULL可能被误匹配整数重载,nullptr则确保精准调用指针版本函数。

为什么不能直接用 nullptr 赋值给整数变量
很多人写 int x = nullptr; 编译失败,不是语法错,而是类型不匹配:nullptr 是独立的字面量类型 std::nullptr_t,只隐式转换为指针类型(含成员指针),不转为整数。C++11 之后它和 0、NULL 彻底划清界限。
常见错误现象:error: cannot convert 'std::nullptr_t' to 'int' in initialization
- 正确用法只限指针上下文:函数参数、返回值、变量声明、
delete、if (p == nullptr) -
NULL在多数实现里是0或(void*)0,可能被误用于整数重载函数;nullptr则永远只匹配指针重载 - 模板推导中更安全:比如
foo(nullptr)一定调用指针版本,而foo(NULL)可能意外匹配int版本
在函数重载中怎么靠 nullptr 精准选型
这是 nullptr 最实用的场景之一——让编译器明确知道你想传空指针,而不是整数零。
void func(int) { std::cout
- 所有指针类型重载(
int*、std::string*、void*)都能接受nullptr - 如果同时有
std::nullptr_t重载,它会成为最佳匹配(比任何指针类型都更特化) - 注意:
std::function构造时传nullptr会变成空态,但调用时报std::bad_function_call
delete 和 delete[] 前要不要检查 nullptr
不需要。C++ 标准规定对空指针调用 delete 或 delete[] 是合法且无操作的(no-op),不会崩溃也不会泄漏。
- 写
if (p) delete p;属于冗余,增加分支却无收益 - 但要注意:
delete p;后p不自动变nullptr,野指针风险仍在,建议手动置空:delete p; p = nullptr; - 使用智能指针(
std::unique_ptr、std::shared_ptr)后,这个问题基本消失,它们析构时自动处理空指针
和 std::optional、std::variant 混用时要注意什么
nullptr 是底层指针语义,而 std::optional 是值语义的“可能存在”,二者不等价,不能混为一谈。
-
std::optional是合法的,但表示的是“opt 有值,其值为空指针”,不是“opt 无值”opt = nullptr; - 要表达“无值”,得用
std::optional或默认构造opt = std::nullopt; -
std::variant可以存nullptr,但取值时必须用std::get_if判断,不能靠(&v) v == nullptr—— variant 没有重载==与nullptr
真正容易被忽略的是:把 nullptr 当作“逻辑空”来用,掩盖了设计上是否该用 optional 或 variant 的问题。指针空值解决的是内存访问安全,而 optional 解决的是业务建模中的“缺失值”语义——两者动机不同,别因为方便就强行统一。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











