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
.另一方面,它看起来也不像函数声明.
解析没有区别.这两种情况都包含在simple-type-specifier后跟可选的括号表达式列表中.
语义含义在C++ 17(N4659)[expr.type.conv]/2中指定:
如果类型是cv
void
且初始化程序是()
,则表达式是指定类型的prvalue,它不执行初始化.否则,表达式是指定类型的prvalue,其结果对象使用初始化程序直接初始化.
这具体说明void()
是类型的prvalue void
.
现在,我敢肯定,它不打算是void类型的prvalue是非法的,因为它是一个普遍的现象,例如,(void)x;
或调用空函数!
但我无法找到标准中的哪个位置表示应该为void
prvalues 抑制临时实现.[class.temporary]/2似乎说丢弃值表达式总是实现临时的; 并且实现不完整类型的prvalue是错误的.也许这是标准中的缺陷.
关于"未使用的值"的警告的差异可能是因为类型的未使用值void
是常见的并且警告没有帮助.
归档时间: |
|
查看次数: |
317 次 |
最近记录: |