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

fel*_*lix 31 c++ nullptr auto c++17

这个定义有效:

const auto &b{nullptr};
Run Code Online (Sandbox Code Playgroud)

虽然失败了:

auto *b{nullptr};
Run Code Online (Sandbox Code Playgroud)

我试图在Visual C++,GCC和Clang中编译它.他们都抱怨"不能推断出类型".

在第二种情况下,不b应该推断出有某种类型的std::nullptr_t

Som*_*ude 37

这是因为你声明b是一个指针,并将其初始化为空指针.但是一个空指针指向你没有说什么类型的数据,所以编译器无法推断出类型.

如果你想b成为一个std::nullptr_t对象,你应该删除星号:

auto b{nullptr};
Run Code Online (Sandbox Code Playgroud)

  • 啊,`nullptr`,*not-a-pointer*指针文字 (24认同)
  • @felix当你考虑到`nullptr`既可以转换为所有指针类型也可以转换为所有成员指针类型时,它就不再是奇怪了. (5认同)
  • 谢谢!我刚刚意识到nullptr的类型是std :: nullptr_t,它不是一个指针......这很奇怪,但在这种情况下有意义. (2认同)

Jar*_*d42 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)
Run Code Online (Sandbox Code Playgroud)

nullptr不是指针(即使它可以转换为).

所以auto *b{nullptr};无效.

你可以改用

auto b{nullptr}; // auto is std::nullptr_t
Run Code Online (Sandbox Code Playgroud)


for*_*818 12

nullptr是类型的std::nullptr_t.因为a nullptr没有指向任何东西,所以没有相应的指针类型std::nullptr_t(nullptr因此不允许取消引用)

auto *b { nullptr};
Run Code Online (Sandbox Code Playgroud)

请求一个不存在的类型.如果你想b成为类型nullptr_t只是写

auto b { nullptr};
Run Code Online (Sandbox Code Playgroud)