Я разрабатываю несколько тестов для класса MPL add_signed, который преобразует тип в его подписанный экземпляр. Он определяется следующим образом:
template<class T>
struct add_signed {
typedef T type;
};
template<>
struct add_signed<std::uint8_t> {
typedef std::int8_t type;
};
template<>
struct add_signed<std::uint16_t> {
typedef std::int16_t type;
};
template<>
struct add_signed<std::uint32_t> {
typedef std::int32_t type;
};
template<>
struct add_signed<std::uint64_t> {
typedef std::int64_t type;
};
При тестировании на разных типах я заметил, что следующее значение соответствует true:
std::is_same<add_signed<uintptr_t>::type, intptr_t>::value // true
Аналогично для класса MPL add_unsigned следующий код оценивается как true:
std::is_same<add_unsigned<intptr_t>::type, uintptr_t>::value // true
Мой компилятор - это MSVC 2010.
Итак, вопрос: можем ли мы предположить, что во всех (sane) компиляторах подписание intptr_t будет производить uintptr_t и наоборот?