解析void()和int()之间的区别

Iva*_*nov 12 c++ most-vexing-parse language-lawyer

阅读了最令人烦恼的解析后,我进行了一些实验并找到了这个程序.有两条非常相似的线.其中一个在g ++ 7和clang ++ - 3.9中产生警告,另一个则没有.

int main() {
  void(); // no warning
  int(); // warning: statement has no effect
}
Run Code Online (Sandbox Code Playgroud)

在第二行中,创建了一个默认构造的类型对象int并立即销毁,因此未使用.但是第一行会发生什么?如果以相同的方式解析它,则应该是错误,因为创建类型的对象是非法的void.另一方面,它看起来也不像函数声明.

M.M*_*M.M 5

解析没有区别.这两种情况都包含在simple-type-specifier后跟可选的括号表达式列表中.

语义含义在C++ 17(N4659)[expr.type.conv]/2中指定:

如果类型是cv void且初始化程序是(),则表达式是指定类型的prvalue,它不执行初始化.否则,表达式是指定类型的prvalue,其结果对象使用初始化程序直接初始化.

这具体说明void()是类型的prvalue void.

现在,我敢肯定,它不打算是void类型的prvalue是非法的,因为它是一个普遍的现象,例如,(void)x;或调用空函数!

但我无法找到标准中的哪个位置表示应该为voidprvalues 抑制临时实现.[class.temporary]/2似乎说丢弃值表达式总是实现临时的; 并且实现不完整类型的prvalue是错误的.也许这是标准中的缺陷.


关于"未使用的值"的警告的差异可能是因为类型的未使用值void是常见的并且警告没有帮助.