【发布时间】:2014-12-06 05:49:09
【问题描述】:
这几乎肯定是Is gcc wrong not diagnose narrowing conversions in non-type template arguments? 的副本,但它并不能提供令人满意的答案。答案并没有说明 GCC 在不提供诊断方面是否错误,只是给出了一个在某种程度上可以替代的警告标志。
标准的相关章节:
§ 14.3.2/5
对于整数或枚举类型的非类型模板参数, 转换后的常量表达式 (5.19) 中允许的转换是 已申请。
§ 5.19/3
类型 T 的转换后的常量表达式是文字常量 表达式,隐式转换为类型 T,其中隐式 在文字常量表达式中允许转换(如果有),并且 隐式转换序列仅包含用户定义的 转换、左值到右值转换 (4.1)、积分促销 (4.5) 和除窄转换以外的积分转换 (4.7) (8.5.4)
标准解决了缩小转换会使程序格式错误的情况,但这里有一个明显的遗漏,因此编译器不同意(GCC 不提供诊断,Clang 将其作为错误,MSVC 也不提供诊断。)是标准中是否有针对这种情况的语言说明,需要进行诊断(即格式不正确)?
#include <array>
int main()
{
std::array<int, -1> a;
}
【问题讨论】:
-
您引用的段落似乎很清楚地表明该程序确实格式错误;你所说的这个“明显的遗漏”是什么?您引用的 SO 问题的 cmets 中提到了 GCC bug report。此外,从技术上讲,警告是一种诊断。
-
@Igor 我知道错误报告,但它并没有真正消失。它甚至没有分配给任何人。您必须明确启用的警告标志是
-Wsign-conversion,而 Clang 明确表示它是具有缩小转换的非类型模板参数。根据您的 GCC 构建,它可能会出错,因为结果大小对于变量来说太大了,而不是因为缩小转换。但无论如何,问题已经得到解答。 -
I'm aware of the bug report, but it hasn't really gone anywhere也许吧,但是是什么让 SO 成为表达这种不满的合适场所?如何帮助将错误报告转移到某个地方? -
@Igor 不一定。它可能包含更多信息,例如来自开发人员的反馈,无论他们是否认为这是一个错误,或者像 Jerry 所做的那样提供更多标准参考。否则,它就会悬空。
标签: c++ c++11 language-lawyer