C++14从初始化列表推导数组类型函数参数是否存在规范缺陷?
回答
首先明确结论:该情况属于C14标准的规范疏漏,对应已确认的C标准核心工作组(CWG)缺陷报告为CWG 1591。
细节说明
- 按照C14的正式标准规则,你给出的#1代码本应非法:
根据C14 [temp.deduct.type]/5.6条款要求:如果函数实参是花括号初始化列表,而对应形参不是std::initializer_list或其带cv限定的引用类型时,该形参属于非推导上下文,无法完成模板参数推导。C14没有任何额外条款为数组引用的推导提供例外规则,因此严格按照C14标准,#1代码应该编译失败。 - 主流编译器在C14模式下接受该代码,属于厂商提前实现后续标准修正的兼容行为,并非C14的标准要求。
- CWG 1591就是针对该场景提出的缺陷,委员会认可从非空花括号初始化列表推导数组类型的合理性,对应的规则修改最终被纳入C++17标准,也就是你提到的[temp.deduct.call]/1新增的数组推导规则。
内容的提问来源于stack exchange,提问作者dfrib
相关产品推荐
相关产品推荐

