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

时间:2019-01-23 15:20:53

标签: c++ syntax casting

我正在尝试做类似的事情:

auto foo = int*(nullptr);

使用VC ++时不会与错误消息一起编译:

  

不允许输入类型名称

并且在GCC 8.2中无法使用:

  

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

我真的很好奇为什么这似乎是非法语法。我认为应该没问题,因为可以像这样初始化文字。

auto foo = int(2);

我唯一可以想到的方法就是制作一个类型别名或执行以下操作:

auto foo = std::add_pointer_t<int>(nullptr);

为此,我尝试使用谷歌搜索功能,但坦白说,由于我的标准语言较弱,我什至不知道如何正确地提出这个问题。任何见识将不胜感激!

2 个答案:

答案 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;