为什么 const auto &p{nullptr} 在 C++17 中不起作用,而 auto *p{nullptr} 不起作用?
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中编译它。他们都抱怨"无法推断类型"。
在第二种情况下,b
不应该被推断为具有像std::nullptr_t
这样的类型吗?
这是因为您将b
声明为指针,并将其初始化为空指针。但是一个空指针指向你不说的数据类型,所以编译器无法推断出类型。
如果您希望b
成为std::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
nullptr
的类型为std::nullptr_t
。由于nullptr
不指向任何内容,因此std::nullptr_t
没有相应的 pointee 类型(不允许取消引用nullptr
(,因此
auto *b { nullptr};
请求不存在的类型。如果您希望b
属于nullptr_t
类型,只需编写
auto b { nullptr};
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么 const auto &p{nullptr} 在 C++17 中不起作用,而 auto *p{nullptr} 不起作用?
- SetCapture 不起作用并返回 nullptr