此代码在VC11下为两个检查打印出“unsigned short”,但第一个检查在VC10下打印“int”。我一直希望std::common_type<T,T>::type
为T
。这是一个错误还是允许的行为?也许VC10的实现和最终的C ++ 11标准之间的行为发生了变化?
#include <iostream>
#include <typeinfo>
#include <type_traits>
int main(int argc, const char* argv[])
{
unsigned short a = 1;
unsigned short b = 2;
auto c = true ? a : b;
std::cout << typeid(std::common_type<unsigned short, unsigned short>::type).name() << std::endl; // VC10: int
std::cout << typeid(c).name() << std::endl; // VC10: unsigned short
return 0;
}
答案 0 :(得分:3)
是的,它是错误的。 std :: common_type是VC10中的一种黑客,它使用类型提升,使sizeof
小于sizeof(int)
的任何内容都提升为int
:
std::_Ipromo<unsigned short>::_Type _PromoTy0;
_PromoTy0 is an int.