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

vli*_*ind 0 c++ syntax casting

我试图做类似的事情:

auto foo = int*(nullptr);
Run Code Online (Sandbox Code Playgroud)

哪个VC++不能编译错误消息:

不允许输入名称

并且GCC 8.2不能编译:

'int'之前的预期主表达式

我真的很好奇为什么这似乎是一种非法的语法.在我看来它应该没问题,因为文字可以像这样初始化.

auto foo = int(2);
Run Code Online (Sandbox Code Playgroud)

我能想到让它工作的唯一方法是创建一个类型别名或执行此操作:

auto foo = std::add_pointer_t<int>(nullptr);
Run Code Online (Sandbox Code Playgroud)

我试着谷歌搜索,但坦率地说,我甚至不知道如何正确地提出这个问题,因为我的标准很弱.任何见解将不胜感激!

Sto*_*ica 8

int*是一个"派生的声明者类型"(不是标准术语,但对于推理这一点很有用).函数样式强制转换表示法(也就是说int(2))只能包含"简单类型说明符或类型名称说明符".派生的声明符类型不属于任何一种类别.

你必须要么:


son*_*yao 7

int*(nullptr)不起作用,因为在功能转换表达式中只能使用单字类型名称.请注意,这不是单字类型名称,而是(然后工作正常).int*intint(2)

函数强制转换表达式由简单的类型说明符或typedef说明符组成(换句话说,单字类型名称:unsigned int(expression)int*(expression)无效),后跟括号中的单个表达式.

作为解决方法,你可以使用typedef,

typedef int* int_pointer;
auto foo = int_pointer (nullptr);
Run Code Online (Sandbox Code Playgroud)

或者将其更改为c风格的演员表达.

auto foo = (int*) nullptr;
Run Code Online (Sandbox Code Playgroud)