std :: is_signed不适用于强类型枚举:int

x y*_*x y 6 c++ enums c++11

任何人都可以解释,为什么

#include <iostream>
#include <type_traits>
using namespace std;
enum E : signed int { a=-1, b = 1,};
int main() {
    std::cout << std::boolalpha;
    cout << "strong typed enum E:int should be signed, but is_signed returns " 
    << is_signed<E>() << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

std :: is_signed <>不行,它在锡上说的是什么?谢谢...

Sha*_*our 7

如果我们查看is_signed的文档,它会说:

如果T是带符号的算术类型,则提供成员常量值等于true.对于任何其他类型,值为false.

并且枚举不是算术类型,因此结果应该是假的.从草案C++ 11标准部分3.9.1基本类型[basic.fundamental]:

[...]积分和浮动类型统称为算术类型[...]

您可以使用std :: underlying_type获取枚举的基础类型,然后应用于std::is_signed该类型.

  • @xy这是一个意见问题,真的.如果枚举类型报告为签名,我自己会非常惊讶. (3认同)
  • @xy再次,我反过来看待它 - 对我而言,强类型枚举比算术类型更远,而不是"通常",缺乏隐式转换和所有. (2认同)