这个定义有效:
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
没有相应的指针类型(你不允许取消引用nullptr
),因此
auto *b { nullptr};
请求一个不存在的类型。如果你想b
是nullptr_t
类型,只需写
auto b { nullptr};