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

时间:2018-09-11 11:09:06

标签: c++ c++17 auto nullptr

此定义有效:

const auto &b{nullptr};

这失败了:

auto *b{nullptr};

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

在第二种情况下,不应该推论bstd::nullptr_t这样的类型吗?

3 个答案:

答案 0 :(得分:37)

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

如果您希望bstd::nullptr_t对象,则应删除星号:

auto b{nullptr};

答案 1 :(得分: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

答案 2 :(得分:12)

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

auto *b { nullptr};

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

auto b { nullptr};