为什么我不能使用 nullptr 初始化自动推导的指针?
Why can't I initialize an auto deduced pointer with nullptr?
我试图做类似的事情:
auto foo = int*(nullptr);
使用 VC++ 不会编译错误消息:
不允许使用类型名称
并且使用 GCC 8.2 不编译:
"int"之前的预期主表达式
我真的很好奇为什么这似乎是一种非法语法。在我看来,这应该没问题,因为文字可以像这样初始化。
auto foo = int(2);
我能想到的唯一方法就是制作一个类型别名或这样做:
auto foo = std::add_pointer_t<int>(nullptr);
我尝试在谷歌上搜索这个,但坦率地说,我什至不知道如何正确表述这个问题,因为我的标准很弱。任何见解将不胜感激!
int*
是一个"派生声明器类型"(不是标准术语,但对此进行推理很有用)。函数式样式转换表示法(即int(2)
)只能包含"简单类型说明符或类型名说明符"。派生声明符类型不属于任一类别。
您必须:
-
以C式演员表的形式写出来:
auto foo = (int*) nullptr;
-
或以C++式演员表的形式:
auto foo = static_cast<int*>(nullptr);
-
或为指针类型设置别名:
using iptr = int*; auto foo = iptr(nullptr);
int*(nullptr)
不起作用,因为函数式强制转换表达式中只能使用单个单词类型名称。请注意,int*
不是单字类型名称,而int
是(然后int(2)
工作正常)。
函数强制转换表达式由一个简单的类型说明符或 typedef 说明符(换句话说,单个单词的类型名称:
unsigned int(expression)
或int*(expression)
无效)组成,后跟括号中的单个表达式。
作为解决方法,您可以使用typedef
,
typedef int* int_pointer;
auto foo = int_pointer (nullptr);
或将其更改为 C 样式强制转换表达式。
auto foo = (int*) nullptr;
相关文章:
- 如何使用数据对象上的常量指针初始化类
- 使用指针初始化 char 数组或字符串 C++
- 使用无效指针初始化指针声明符的行为是否未定义?
- 指针:初始化与声明
- 启动线程会导致指针初始化时出现分段错误
- 使用函数声明进行函数指针初始化 - 是否可能
- 类初始化中的指针初始化
- 结构数组的指针初始化
- 如何从其抽象母类上的指针初始化子类?
- C 用结构指针初始化结构
- 如何用无效指针初始化unique_ptr的向量
- PCL中的这些增强指针初始化是不同的
- 通过指针初始化结构
- 从函数指针初始化成员函数
- 使用作用域内生成的指针初始化静态成员
- 使用"this"指针初始化 std::array
- C++缺乏指针初始化和使用逻辑
- constexpr 使用指针初始化
- C 指针初始化的不良初始化可能是什么后果
- 指针初始化无效?如果不是,那是什么