C++ 为什么可以';我用nullptr初始化一个自动推导的指针吗?
我试着做类似的事情:C++ 为什么可以';我用nullptr初始化一个自动推导的指针吗?,c++,syntax,casting,C++,Syntax,Casting,我试着做类似的事情: auto foo = int*(nullptr); 使用VC++进行编译时不会显示错误消息: 不允许使用类型名称 对于GCC 8.2,编译时不使用: “int”之前应为主表达式 我真的很好奇为什么这似乎是一个非法的语法。在我看来,它应该是好的,因为文字可以像这样初始化 auto foo = int(2); 我唯一能想到的办法是创建一个类型别名或执行以下操作: auto foo = std::add_pointer_t<int>(nullptr); auto
auto foo = int*(nullptr);
使用VC++进行编译时不会显示错误消息:
不允许使用类型名称
对于GCC 8.2,编译时不使用:
“int”之前应为主表达式
我真的很好奇为什么这似乎是一个非法的语法。在我看来,它应该是好的,因为文字可以像这样初始化
auto foo = int(2);
我唯一能想到的办法是创建一个类型别名或执行以下操作:
auto foo = std::add_pointer_t<int>(nullptr);
auto foo=std::add_pointer_t(nullptr);
我试着用谷歌搜索这个问题,但坦率地说,我甚至不知道如何恰当地表达这个问题,因为我的标准很弱。如有任何见解,将不胜感激 int*
是一个术语(不是一个标准术语,但用于对此进行推理)。函数样式转换表示法(即int(2)
所指的)只能包含一个。派生的声明器类型不属于这两个类别
你必须:
- 以C字型演员表的形式写出来:
auto foo = (int*) nullptr;
auto foo = static_cast<int*>(nullptr);
- 或者以C++样式转换的形式:
auto foo = (int*) nullptr;
auto foo = static_cast<int*>(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;
最烦人的还是类似的?试着用
int*{}
来代替。当唯一的效果是你需要施法时,为什么要使用auto
?它没有回答这个问题,但是如果你写int*foo=nullptr代码>问题不存在exist@Someprogrammerdude我用GCC 8.2、Clang 7.0和最新的VC++试过了,但也不起作用。@user463035818我为什么要这样做与我的问题无关。我想知道为什么不可能。我不是在问良好的实践,我是在问为什么这在语言中是非法的。这与auto
无关,RHS本身是无效的<代码>(int*)空PTR代码>将起作用。回答也很好,谢谢。我真的很感激。这对我来说是一个很好的总结。非常感谢。竖起大拇指。