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

问题描述 投票:31回答:3

这个定义有效:

const auto &b{nullptr};

虽然失败了:

auto *b{nullptr};

我试图在Visual C ++,GCC和Clang中编译它。他们都抱怨“不能推断出类型”。

在第二种情况下,不应该推断b有类似std::nullptr_t的类型?

c++ c++17 auto nullptr
3个回答
37
投票

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

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

auto b{nullptr};

16
投票

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

12
投票

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

auto *b { nullptr};

请求一个不存在的类型。如果你想bnullptr_t类型,只需写

auto b { nullptr};
© www.soinside.com 2019 - 2024. All rights reserved.