【问题标题】:Why is nullptr a part of the core language, but nullptr_t is a part of STL?为什么 nullptr 是核心语言的一部分,而 nullptr_t 是 STL 的一部分?
【发布时间】:2019-08-23 14:42:40
【问题描述】:

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

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

nullptr_t定义如下:

namespace std { typedef decltype(nullptr) nullptr_t; }

并且在标头<cstddef>中定义。

【问题讨论】:

  • 相关/可能是骗子:stackoverflow.com/questions/39080709/…
  • 如果你愿意和decltype(nullptr)一起生活,你不需要nullptr_tnullptr_t 不是核心概念,它是一个帮手。
  • 您有时需要nullptr_t:“如果两个或多个重载接受不同的指针类型,则std::nullptr_t 的重载对于接受空指针参数是必要的。” (std::nullptr_t 的 cppreference)。
  • @Adrian 我假设您打算回复我的评论。如果是这样,我说你不需要nullptr_t如果你愿意和decltype(nullptr)一起生活。您可以使用decltype(nullptr) 代替nullptr_tnullptr_t 只是 decltype(nullptr); 的方便别名。你应该使用nullptr_t,我的评论是为了说明为什么nullptr_t可能不是核心语言的一部分。
  • 另外,通过使nullptr 成为语言的一部分,更容易确保它按应有的方式工作,因为您可以轻松地制定特定规则。

标签: c++ c++11 nullptr


【解决方案1】:

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

nullptr 篡夺了0 的使用,既表示空指针又表示零。使用0 导致问题的原因很明显,f(0) 是否调用f(int)f(int*)?因此,核心语言中添加了一个全新的文字:nullptr。它的类型只是decltype(nullptr),所以nullptr_t 被添加为快捷方式:

namespace std {
    using nullptr_t = decltype(nullptr);
}

【讨论】:

  • 谢谢,但是 nullptr 本身可以是 STL 的一部分... nullptr 是否包含在核心语言中以不需要开发人员包含任何头文件?
  • @embedc 任何std typedef,例如std::stize_t是通过标头提供的,那又怎样?
  • @embedc nullptr 是类似5'a'"hello" 的字面量。虽然我无法想象它是什么,但我敢打赌,空指针文字比在std 中具有类似nullptr 的对象更好是有充分的技术原因的。编辑:一方面,作为一个文字,它是一个纯右值,所以你不能接受它的地址。能够获取nullptr 的地址对我来说似乎很奇怪。这就像获取true 的地址。
  • 不需要标题。它是一个内置的关键字/指针文字。
【解决方案2】:

引入nullptrN2431 的提案在第 1.1 节中指出,最好不要强制用户包含标头以使用nullptr

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

【讨论】:

  • 这实际上回答了这个问题。
【解决方案3】:

来自 cppreference.com:

std::nullptr_t 是 空指针字面量的类型,nullptr。它是一种独特的类型,它本身不是指针类型或指向成员类型的指针。

如果两个或多个重载接受不同的指针类型,需要 std::nullptr_t 的重载才能接受空指针参数

然后您可以使用std::nullptr_t 解决重载函数调用的歧义。

例如:

void Foo(int* ptr) {}
void Foo(double* ptr) {}
void Foo(std::nullptr_t ptr) {} // This overload is called if Foo(nullptr) is invoked

在此处阅读有关std::nullptr_t 的更多信息:https://en.cppreference.com/w/cpp/types/nullptr_t

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 2011-08-19
    • 2011-03-17
    • 2011-08-23
    • 2016-12-07
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多