C++ VC10编译器下的std::common_类型错误吗?

C++ VC10编译器下的std::common_类型错误吗?,c++,C++,这段代码在VC11下为两个检查打印“unsigned short”,但第一个检查在VC10下打印“int”。我总是希望std::common_type::type是T。这是错误还是允许的行为?也许VC10的实现和最终的C++11标准之间的行为发生了变化 #include <iostream> #include <typeinfo> #include <type_traits> int main(int argc, const char* argv[]) {

这段代码在VC11下为两个检查打印“unsigned short”,但第一个检查在VC10下打印“int”。我总是希望
std::common_type::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;
}
#包括
#包括
#包括
int main(int argc,const char*argv[]
{
无符号短a=1;
无符号短b=2;
自动c=真?a:b;

std::cout是的,它有bug。std::common_type是VC10中的一种黑客,它使用类型升级,使得任何
sizeof
小于
sizeof(int)
的内容都升级为
int

std::_Ipromo<unsigned short>::_Type _PromoTy0;

_PromoTy0 is an int.
std::\u Ipromo::\u Type\u PromoTy0;
_PromoTy0是一个int。

当然它没有从C++03更改,因为它只是在C++11中添加的。@jrok:很好!我将更改这个问题,让自己看起来不那么愚蠢!您有权访问
common_type
的实现源代码(标题)对于VC10和/或VC11?否则,建议使用条件表达式实现它,因此您可以在标准:-)中测试类似于
无符号短a,b;cout@jrok的内容。说真的,它是
decltype(true?declval():declval()
,它将我们发送到
?:
运算符。在这里,一旦您完成了所有不适用的情况,您将得到“第二个和第三个操作数具有相同的类型;结果就是该类型。”只有当这一点不成立时,才能进入下一点,这是通常的算术转换,从整数提升开始。@JamesKanze-common_类型不是用来计算算术表达式的类型,而是用来替换三元运算符的库,并对其他库类型进行专门化(即持续时间).auto对于表达式类型来说通常已经足够了。讨厌!感谢您检查了实现!这也是我建议从VC10升级的另一个原因…偶尔我会被要求查看/处理一个仍在使用VC10的项目,这让我有点难过。但至少有一段时间没有人让我查看VC6项目:/