【问题标题】:Why does const auto &p{nullptr} work while auto *p{nullptr} doesn't in C++17?为什么 const auto &p{nullptr} 工作,而 auto *p{nullptr} 在 C++17 中不起作用?
【发布时间】:2019-02-15 21:01:51
【问题描述】:

这个定义有效:

const auto &b{nullptr};

虽然失败:

auto *b{nullptr};

我尝试在 Visual C++、GCC 和 Clang 中编译它。他们都抱怨“无法推断类型”。

在第二种情况下,不应该将b 推导出为std::nullptr_t 之类的类型吗?

【问题讨论】:

  • 您的意思是使用auto b{nullptr}; 吗?
  • 如果您认为第二个b 的类型为std::nullptr_t,您认为第一个b 的类型是什么?
  • 我是唯一一个认为std::nullptr_t b; 更具可读性的人吗?

标签: c++ c++17 auto nullptr


【解决方案1】:

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

如果你想让b 成为std::nullptr_t 对象,你应该去掉星号:

auto b{nullptr};

【讨论】:

  • 谢谢!我刚刚意识到 nullptr 的类型为 std::nullptr_t ,它不是指针......这很奇怪,但在这种情况下是有道理的。
  • @felix 当您考虑到nullptr 可以转换为所有指针类型和所有成员指针类型时,它就不再奇怪了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    nullptr 的类型为 std::nullptr_t。由于nullptr 不指向任何东西,因此std::nullptr_t 没有对应的指针类型(您不能取消引用nullptr),因此

    auto *b { nullptr};
    

    请求一个不存在的类型。如果您希望 bnullptr_t 类型,只需编写

    auto b { nullptr};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      相关资源
      最近更新 更多