Я использую следующий шаблон для кодирования значений без знака полукокса:Unsigned Char Шаблон Значение Переполнение
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'
I s переполнение обрабатывается по-разному в контексте шаблонов?
Спасибо для указания меня в правильном направлении и предоставления решения. Вот статья, объясняющая интегральную рекламу C++ чуть более подробно: http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_promotion –
@KerrekSB А, правильно. 'unsigned int 'также возможен. – dyp
* «Не существует разумного значения для параметра шаблона типа unsigned char, которому должен быть задан аргумент int». * Я думаю, что это возможно, это просто не может быть сужающим преобразованием. I.e., 'val-1' могут быть преобразованы в' unsigned char' до тех пор, пока 'val> 0'. – dyp