为什么 const auto &p{nullptr} 工作而 auto *p{nullptr} 在 C++17 中不工作?
Why does const auto &p{nullptr} work while auto *p{nullptr} doesn't in C++17?
这个定义有效:
const auto &b{nullptr};
虽然失败了:
auto *b{nullptr};
我试过用 Visual C++、GCC 和 Clang 编译它。他们都在抱怨"cannot deduce type".
在第二种情况下,不应该将 b
推导为 std::nullptr_t
这样的类型吗?
是因为你声明b
为指针,并初始化为空指针。但是一个指向什么类型数据的空指针你不说,所以编译器无法推断出类型。
如果你想让b
成为一个std::nullptr_t
对象,你应该去掉星号:
auto b{nullptr};
nullptr
是 std::nullptr_t
类型。由于 nullptr
不指向任何东西,因此 std::nullptr_t
没有相应的指针对象类型(不允许取消引用 nullptr
),因此
auto *b { nullptr};
请求的类型不存在。如果您希望 b
是 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
这个定义有效:
const auto &b{nullptr};
虽然失败了:
auto *b{nullptr};
我试过用 Visual C++、GCC 和 Clang 编译它。他们都在抱怨"cannot deduce type".
在第二种情况下,不应该将 b
推导为 std::nullptr_t
这样的类型吗?
是因为你声明b
为指针,并初始化为空指针。但是一个指向什么类型数据的空指针你不说,所以编译器无法推断出类型。
如果你想让b
成为一个std::nullptr_t
对象,你应该去掉星号:
auto b{nullptr};
nullptr
是 std::nullptr_t
类型。由于 nullptr
不指向任何东西,因此 std::nullptr_t
没有相应的指针对象类型(不允许取消引用 nullptr
),因此
auto *b { nullptr};
请求的类型不存在。如果您希望 b
是 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