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

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

这个定义有效:

const auto &b{nullptr};

虽然失败了:

auto *b{nullptr};

我试过用 Visual C++、GCC 和 Clang 编译它。他们都在抱怨"cannot deduce type".

在第二种情况下,不应该将 b 推导为 std::nullptr_t 这样的类型吗?

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

如果你想让b成为一个std::nullptr_t对象,你应该去掉星号:

auto b{nullptr};

nullptrstd::nullptr_t 类型。由于 nullptr 不指向任何东西,因此 std::nullptr_t 没有相应的指针对象类型(不允许取消引用 nullptr),因此

auto *b { nullptr};

请求的类型不存在。如果您希望 bnullptr_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