C++ 为什么const auto&;p{nullptr}工作,而auto*p{nullptr}不工作';C+中的t+;17?
这一定义适用于:C++ 为什么const auto&;p{nullptr}工作,而auto*p{nullptr}不工作';C+中的t+;17?,c++,c++17,auto,nullptr,C++,C++17,Auto,Nullptr,这一定义适用于: const auto &b{nullptr}; 尽管这样做失败了: auto *b{nullptr}; 我试图用VisualC++、GCC和CLAN编译这个。他们都抱怨“无法推断类型” 在第二种情况下,不应该推断b具有类似std::nullptr\t的类型吗?这是因为您将b声明为指针,并将其初始化为空指针。但是一个空指针指向你没有说的数据类型,因此编译器无法推断该类型 如果希望b成为std::nullptr\u t对象,则应删除星号: auto b{nullptr}
const auto &b{nullptr};
尽管这样做失败了:
auto *b{nullptr};
我试图用VisualC++、GCC和CLAN编译这个。他们都抱怨“无法推断类型”
在第二种情况下,不应该推断
b
具有类似std::nullptr\t
的类型吗?这是因为您将b
声明为指针,并将其初始化为空指针。但是一个空指针指向你没有说的数据类型,因此编译器无法推断该类型
如果希望b
成为std::nullptr\u t
对象,则应删除星号:
auto b{nullptr};
nullptr
属于std::nullptr\u t
类型。由于nullptr
不指向任何对象,因此std::nullptr\u t
没有相应的指针类型(不允许取消引用nullptr
),因此
请求不存在的类型。如果希望b
为nullptr\t
类型,只需编写
auto b { nullptr};
decltype(nullptr)
isstd::nullptr\u t
所以
const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)
但是nullptr
不是指针(即使它可以转换为)
soauto*b{nullptr}代码>无效
您可以使用
auto b{nullptr}; // auto is std::nullptr_t
你的意思是使用auto b{nullptr}代码>?如果你认为第二个b
会有类型std::nullptr\t
,你认为第一个b
有什么类型?我是唯一一个认为std::nullptr\t b的人吗代码>更可读吗?谢谢!我刚刚意识到nullptr的类型std::nullptr_t不是指针。。。。这很奇怪,但在这种情况下有意义。@felix当您考虑到nullptr
既可转换为所有指针类型,也可转换为所有成员指针类型时,它就不再奇怪了。
auto b{nullptr}; // auto is std::nullptr_t