【发布时间】:2021-11-02 12:27:26
【问题描述】:
多年来,我一直在编写 C++,使用 nullptr 作为空指针。我也知道 C,NULL 的来源,记住它是空指针的常量,类型为void *。
出于某些原因,我不得不在我的 C++ 代码中使用 NULL 来做一些事情。好吧,想象一下当在某些模板参数推导过程中编译器告诉我我的 NULL 真的是……长时,我会感到惊讶。所以,我仔细检查了:
#include <type_traits>
#include <cstddef>
static_assert(not std::is_same<decltype(NULL), long>::value, "NULL is long ???");
事实上,静态断言失败(使用 GCC 和 Clang)。
我查看了cppreference.com,果然(C++11 措辞):
宏NULL是一个实现定义的空指针常量,可以是 一个值为 0 的整型文字,或类型为
std::nullptr_t的纯右值。
为什么这有意义?就其本身而言,以及鉴于 C 的不兼容性?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
-
einpoklum,“我也知道 C,NULL 的起源,记住它是空指针的常量,类型为 void *。”过于狭窄,因为 C 中存在其他可能性。您的 C 引用是什么来支持您肯定是
void *的断言? -
@chux-ReinstateMonica:你说的很对。我对 C 语言中
NULL的假设只是民间传说,这是事实的一部分。
标签: c++ c nullptr null-pointer cross-language