【问题标题】:Are narrowing conversions in non-type template parameters required to be diagnosed?是否需要诊断非类型模板参数中的缩小转换?
【发布时间】: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


【解决方案1】:

从 n3337 开始,已经更改了措辞,以明确结果格式错误。 (§14.3.2/5):

对用作非类型模板参数的每个表达式执行以下转换。如果一个非类型的模板参数不能被转换为相应模板参数的类型,那么程序是错误的。

由于它指定程序格式错误,并且没有给予相反的具体许可,因此需要诊断是否违反此规定(根据 §1.4/1):

可诊断规则集由本国际标准中的所有句法和语义规则组成,但那些包含“不需要诊断”的明确表示法或被描述为导致“未定义行为”的规则除外。

FWIW,请注意,他们还将允许转换的定义与已转换常量表达式的定义分开——可能的转换现在直接列在 §14.3.2/5 中。

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 2020-11-29
    • 1970-01-01
    • 2020-12-08
    • 2018-02-28
    • 2016-03-01
    • 2020-07-19
    • 1970-01-01
    • 2021-09-02
    相关资源
    最近更新 更多