为什么 const auto &p{nullptr} 在 C++17 中不起作用,而 auto *p{nullptr} 不起作用?

Why does const auto &p{nullptr} work while auto *p{nullptr} doesn't in C++17?

本文关键字:nullptr 不起作用 auto const 为什么 C++17      更新时间:2023-10-16

这个定义有效:

const auto &b{nullptr};

虽然此操作失败:

auto *b{nullptr};

我试图在Visual C++,GCC和Clang中编译它。他们都抱怨"无法推断类型"。

在第二种情况下,b不应该被推断为具有像std::nullptr_t这样的类型吗?

这是因为您将b声明为指针,并将其初始化为空指针。但是一个空指针指向你不说的数据类型,所以编译器无法推断出类型。

如果您希望b成为std::nullptr_t对象,则应删除星号:

auto b{nullptr};

decltype(nullptr)std::nullptr_t

所以用

const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)

nullptr不是指针(即使它可以转换为(。

所以auto *b{nullptr};是无效的。

你可以改用

auto b{nullptr}; // auto is std::nullptr_t
nullptr

的类型为std::nullptr_t。由于nullptr不指向任何内容,因此std::nullptr_t没有相应的 pointee 类型(不允许取消引用nullptr(,因此

auto *b { nullptr};

请求不存在的类型。如果您希望b属于nullptr_t类型,只需编写

auto b { nullptr};