【问题标题】:Expected behavior on out-of-range template parameters?超出范围的模板参数的预期行为?
【发布时间】:2016-08-15 17:43:21
【问题描述】:
template<bool b = 2> void foo(void) {}
template void foo();

template<unsigned char n = 258> void bar(void) {}
template void bar();

GCC 实例化 foo 和 bar; Clang 以“错误:非类型模板参数的计算结果为 2,不能将其缩小为类型 'bool' [-Wc++11-narrowing]”拒绝两者。

上面的代码有效吗?这是其中一个错误吗?

使用的版本:Clang 3.8.0-2ubuntu4、GCC 5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.2)

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    这是 gcc 错误 5789160715

    来自 [temp.arg.nontype]:

    非类型模板参数的模板参数应是模板参数类型的转换常量表达式 (5.20)。

    来自 [expr.const]:

    类型 T 的转换常量表达式是隐式转换为类型 T 的表达式,其中转换后的 expression 是一个常量表达式,隐式转换序列仅包含 [...] 整数转换 (4.7),而不是窄化转换 (8.5.4),

    来自 [dcl.init.list]:

    窄化转换是从整数类型或无作用域枚举类型到无法表示所有类型的整数类型的隐式转换 [...] 原始类型的值,除非源是一个常量表达式,其值在整数之后 促销活动将适合目标类型。

    对于模板非类型参数,范围缩小的转换(例如,2bool258char)格式不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多