为什么我不能使用 nullptr 初始化自动推导的指针?

Why can't I initialize an auto deduced pointer with nullptr?

本文关键字:指针 初始化 不能 nullptr 为什么      更新时间:2023-10-16

我试图做类似的事情:

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;