此定义有效:
const auto &b{nullptr};
这失败了:
auto *b{nullptr};
我试图在Visual C ++,GCC和Clang中进行编译。他们都抱怨“无法推断类型”。
在第二种情况下,不应该推论b
像std::nullptr_t
这样的类型吗?
答案 0 :(得分:37)
这是因为您声明b
为指针,并将其初始化为空指针。但是空指针指向您没有说什么类型的数据,因此编译器无法推断出该类型。
如果您希望b
是std::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};