Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么const auto&;p{nullptr}工作,而auto*p{nullptr}不工作';C+中的t+;17?_C++_C++17_Auto_Nullptr - Fatal编程技术网

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)
is
std::nullptr\u t

所以

const auto &b{nullptr}; // auto is std::nullptr_t
// b is a reference to a temporary (with lifetime extension)
但是
nullptr
不是指针(即使它可以转换为)

so
auto*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