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将起作用。回答也很好,谢谢。我真的很感激。这对我来说是一个很好的总结。非常感谢。竖起大拇指。