无符号字符模板值溢出

时间:2014-10-12 20:03:27

标签: c++ templates template-meta-programming

我正在使用以下模板来编码无符号字符值:

template <unsigned char val>
struct Cell {
    enum { value = val };

    using add = Cell<val + 1>;
    using sub = Cell<val - 1>;
};

我希望sub的行为类似于溢出的标准unsigned char变量:

unsigned char x = 0;
x - 1; // 255

但是我在Clang中遇到编译器错误:

using cell = Cell<0>;
cell::sub::value; // Error here.


Non-type template argument evaluates to -1, which cannot be narrowed to type 'unsigned char'

模板上下文中溢出的处理方式不同吗?

1 个答案:

答案 0 :(得分:2)

由于通常的算术转换,

val - 1是您平台上的int。对unsigned char类型的模板参数赋予int参数没有明智的意义。

只需确保您的模板参数具有所需的类型:

using sub = Cell<static_cast<unsigned char>(val - 1U)>;
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^       ^^

(使用unsigned int字面值意味着通常的转换产生unsigned int,其具有明确定义的缩小语义。)