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)
我试着谷歌搜索,但坦率地说,我甚至不知道如何正确地提出这个问题,因为我的标准很弱.任何见解将不胜感激!
int*是一个"派生的声明者类型"(不是标准术语,但对于推理这一点很有用).函数样式强制转换表示法(也就是说int(2))只能包含"简单类型说明符或类型名称说明符".派生的声明符类型不属于任何一种类别.
你必须要么:
以C风格的演员形式写出来:
auto foo = (int*) nullptr;
Run Code Online (Sandbox Code Playgroud)或者以C++风格的演员形式:
auto foo = static_cast<int*>(nullptr);
Run Code Online (Sandbox Code Playgroud)或别名指针类型:
using iptr = int*;
auto foo = iptr(nullptr);
Run Code Online (Sandbox Code Playgroud)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)