我正在使用以下模板来编码无符号字符值:
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'
模板上下文中溢出的处理方式不同吗?
答案 0 :(得分:2)
val - 1
是您平台上的int
。对unsigned char
类型的模板参数赋予int
参数没有明智的意义。
只需确保您的模板参数具有所需的类型:
using sub = Cell<static_cast<unsigned char>(val - 1U)>;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^
(使用unsigned int
字面值意味着通常的转换产生unsigned int
,其具有明确定义的缩小语义。)