【发布时间】:2017-04-29 03:30:18
【问题描述】:
考虑以下 sn-p:
auto f() { return void({}); }
int main() { f(); }
void({}) 中的 {} 到底是什么?
它是如何解释的?
当然,只是出于好奇。无论如何,让我们走得更远。
请注意,GCC 6.1 和 clang 3.8 编译它都没有错误 (-std=c++14 -pedantic)。
后者不抱怨,前者显示警告:
警告:非类类型的列表初始化器不能用括号括起来
使用 -pedantic-errors 代替,GCC 在 clang 编译时以错误结束。
这种差异是否是两个编译器之一的错误?
我的意思是,它是否应该被接受的有效代码?
【问题讨论】:
-
在某些语言中,它表示一个空表或列表。但是,在基于类型的语言中,它应该有一个类型说明符。它与作为初始化程序没有任何关系,所以在 imo 中,它看起来像是某种空块范围。
-
听起来像一个clang bug。这转到[expr.type.conv]/2 的“否则,表达式是指定类型的纯右值,其结果对象使用初始化程序直接初始化([dcl.init])。”,这对
void没有意义。 -
它看起来像 lambda 表达式:link
-
Lamda 表达式应该是
[](){}而不是({}) -
@GManNickG No.
(void) unused通过 [expr.cast]/4.2 到 [expr.static.cast]/6。void(unused)通过 [expr.type.conv]/2 的第一句进入 [expr.cast] (“如果初始化器是带括号的单个表达式,则类型转换表达式是等价的(在定义上,如果在含义上定义) 到相应的强制转换表达式。") 问题是({})不是“带括号的单个表达式”,因为{}不是表达式。
标签: c++ gcc clang c++14 language-lawyer