相关疑难解决方法(0)

如果你为枚举类static_cast无效值会发生什么?

考虑一下这个C++ 11代码:

enum class Color : char { red = 0x1, yellow = 0x2 }
// ...
char *data = ReadFile();
Color color = static_cast<Color>(data[0]);
Run Code Online (Sandbox Code Playgroud)

假设数据[0]实际上是100.根据标准设置的颜色是什么?特别是如果我以后做的话

switch (color) {
    // ... red and yellow cases omitted
    default:
        // handle error
        break;
}
Run Code Online (Sandbox Code Playgroud)

标准是否保证会触发默认值?如果没有,在这里检查错误的正确,最有效,最优雅的方法是什么?

编辑:

作为奖励,该标准是否对此有任何保证,但是用简单的枚举?

c++ c++11

136
推荐指数
1
解决办法
3万
查看次数

为什么C++ 11强类型枚举不能通过指针强制转换为底层类型?

在C++ 11中,我们可以将强类型的枚举(enum class)强制转换为其基础类型.但似乎我们不能指向相同的指针:

enum class MyEnum : int {};

int main()
{
  MyEnum me;

  int iv = static_cast<int>(me); // works
  int* ip = static_cast<int*>(&me); // "invalid static_cast"
}
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么会这样:有什么关于枚举机制的东西让支持这个很难或没有意义吗?这是标准中的简单疏忽吗?别的什么?

在我看来,如果枚举类型真正构建在如上所述的整数类型之上,我们应该不仅能够投射值而且还能投射指针.我们仍然可以使用reinterpret_cast<int*>或者使用C风格的演员表,但这比我认为的更重要.

c++ enums c++11 enum-class strongly-typed-enum

24
推荐指数
4
解决办法
7449
查看次数

超出范围的枚举转换是否可以产生基础类型之外的值?

考虑以下:

#include <iostream>

enum class E : bool { A, B };

void foo(E e)
{
    switch(e)
    {
    case E::A: break;
    case E::B: break;
    default: std::cout << "aha\n";
    }
}

int main()
{
    foo( static_cast<E>(3) );
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否可以default触发案例,即该程序是否产生输出?

N3936中的棘手问题似乎是static_cast将超出范围的整数转换为枚举类型[expr.static.cast]/10时的规范:

可以将整数或枚举类型的值显式转换为枚举类型.如果原始值在枚举值的范围内,则该值不变.否则,结果值未指定(可能不在该范围内).

粗体文本没有明确说明该值必须仍然在基础类型的范围内,但我想知道它是否打算这样做.

c++ language-lawyer c++14

15
推荐指数
1
解决办法
4420
查看次数