C++ 操作员<&书信电报;打印基础类型为short的枚举值是否不明确

C++ 操作员<&书信电报;打印基础类型为short的枚举值是否不明确,c++,enums,C++,Enums,很简单。为什么会发生这种情况?它可以很好地处理所有其他整数类型 enum : unsigned short { ushort_min = static_cast<unsigned short>(0u), ushort_max = static_cast<unsigned short>(~0u) }; enum : short { short_min = short(ushort_max << (sizeof(short) * char

很简单。为什么会发生这种情况?它可以很好地处理所有其他整数类型

enum : unsigned short {
    ushort_min = static_cast<unsigned short>(0u),
    ushort_max = static_cast<unsigned short>(~0u)
};

enum : short {
    short_min = short(ushort_max << (sizeof(short) * char_bit - 1)),
    short_max = short(ushort_max >> 1)
};

std::cout << short_min; // BOOM
enum:无符号短{
ushort\u min=静态铸造(0u),
ushort\u max=静态\u投射(~0u)
};
枚举:短{
短路最小值=短路(短路最大值>1)
};

std::cout示例代码使用gcc编译时没有错误。这里的答案可能是“升级编译器”:

$cat t.C
#包括
枚举:无符号短{
ushort\u min=静态铸造(0u),
ushort\u max=静态\u投射(~0u)
};
枚举:短{
短路最小值=短路(短路最大值>1)
};
int main()
{

std::难道错误消息中肯定不止“砰”一声吗.编译器告诉我operator@user1436187-
ostream
是一种类型;与几乎所有的类型一样,它可以用来定义对象。类型和对象都不能重载。你的建议应该是重载流插入器。嗯,我使用的是最新的Clang,我更倾向于相信它。你的“最新”是什么.Mine大约有一个月了,构建时间戳就证明了这一点。Clang确实可以复制,使用libstdc++和libc++.g++5.2.1在Ubuntu上编译它,但Clang++失败了!
$ cat t.C
#include <iostream>

enum : unsigned short {
    ushort_min = static_cast<unsigned short>(0u),
    ushort_max = static_cast<unsigned short>(~0u)
};

enum : short {
    short_min = short(ushort_max << (sizeof(short) * 8 - 1)),
    short_max = short(ushort_max >> 1)
};

int main()
{
    std::cout << short_min; // BOOM
}
$ g++ -std=c++14 -c -o t.o t.C
$ g++ --version
g++ (GCC) 5.3.1 20151207 (Red Hat 5.3.1-2)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.