为什么nullptr是核心语言的一部分,而nullptr_t是STL的一部分?

emb*_*edc 6 c++ nullptr c++11

据我所知,它nullptr是核心语言的一部分。

引用C ++ 11:(18.2 / 9)

nullptr_t 定义如下:

namespace std { typedef decltype(nullptr) nullptr_t; }

并且在标头中定义<cstddef>

Pau*_*ans 7

因为可以。C ++标准化过程的中心目标是在添加核心语言时尽可能少地更改核心语言。

nullptr篡改使用0表示空指针和er均为零。0出于明显的原因同时使用两个引起的问题,f(0)请致电f(int)还是f(int*)?因此,在核心语言中添加了全新的文字:nullptr。它的类型很简单,decltype(nullptr)因此nullptr_t被添加为快捷方式:

namespace std {
    using nullptr_t = decltype(nullptr);
}
Run Code Online (Sandbox Code Playgroud)

  • @embedc`nullptr`是像`5`,`'a'`或`“ hello”`这样的字面量。虽然我无法想象它是什么,但我敢打赌,有一个很好的技术原因,为什么空指针文字比在`std`中具有类似'nullptr`的对象更好。编辑:一方面,作为文字,它是一个prvalue,所以您不能使用它的地址。能够接受“ nullptr”的地址对我来说似乎很奇怪。这就像获取“ true”的地址。 (2认同)

Bri*_*ian 5

所引入的提案nullptrN2431,在第1.1节表明它是可取的,以便不强迫用户包括报头以使用nullptr

它还指出,“我们不希望nullptr_t在实际程序中看到很多直接使用”。因此,被认为最好添加nullptr_t到库中而不是创建一个仅用于这个模糊目的的新关键字。此外,如果您不想包含标题,您可以随时自行编写decltype(nullptr)