相关疑难解决方法(0)

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

考虑以下:

#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
查看次数

"控制到达非空函数的结束",在枚举类型上使用完全处理的情况切换

为什么即使type_t处理了所有可能的值,此代码也会触发"控制到达非void函数的结尾" ?处理此警告的最佳方法是什么?return -1在切换后添加一个?
(此处测试代码)

typedef enum {
    A,
    B
} type_t;

int useType(type_t x) {
    switch (x) {
        case A:
            return 0;
        case B:
            return 1;
    }
}
Run Code Online (Sandbox Code Playgroud)


相关:检测是否将int转换为枚举结果为非枚举值

c++ g++ compiler-warnings

12
推荐指数
1
解决办法
2853
查看次数

增加预处理器宏

我正在尝试制作一个简单的预处理器循环.(我意识到这是一个可怕的想法,但是很好.)

// Preprocessor.h

#ifndef PREPROCESSOR_LOOP_ITERATION

#define MAX_LOOP_ITERATION 16 // This can be changed.

#define PREPROCESSOR_LOOP_ITERATION 0

#endif

#if (PREPROCESSOR_LOOP_ITERATION < MAX_LOOP_ITERATION)
#define PREPROCESSOR_LOOP_ITERATION (PREPROCESSOR_LOOP_ITERATION + 1) // Increment PREPROCESSOR_LOOP_ITERATION.
#include "Preprocessor.h"
#endif
Run Code Online (Sandbox Code Playgroud)

问题是它看起来不像PREPROCESSOR_LOOP_ITERATION是递增的,所以它只是无限地包含它自己.如果我将该行更改为实际整数(如17),则预处理器会#include正确跳过该指令.

我做错了什么?

c++ loops c-preprocessor

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