我正在尝试做类似的事情:
auto foo = int*(nullptr);
使用VC ++时不会与错误消息一起编译:
不允许输入类型名称
并且在GCC 8.2中无法使用:
'int'之前的预期主要表达式
我真的很好奇为什么这似乎是非法语法。我认为应该没问题,因为可以像这样初始化文字。
auto foo = int(2);
我唯一可以想到的方法就是制作一个类型别名或执行以下操作:
auto foo = std::add_pointer_t<int>(nullptr);
为此,我尝试使用谷歌搜索功能,但坦白说,由于我的标准语言较弱,我什至不知道如何正确地提出这个问题。任何见识将不胜感激!
答案 0 :(得分:8)
int*
是"derived declarator type"(不是标准术语,但对于对此进行推理很有用)。功能样式强制转换表示法(int(2)
是)只能包含"A simple-type-specifier or typename-specifier"。派生的声明符类型不属于任何类别。
您必须:
以C样式强制转换的形式写出来:
auto foo = (int*) nullptr;
或采用C ++样式转换的形式:
auto foo = static_cast<int*>(nullptr);
或别名指针类型:
using iptr = int*;
auto foo = iptr(nullptr);
答案 1 :(得分:7)
int*(nullptr)
不起作用,因为在functional cast expression中只能使用单字类型名称。请注意,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;