静态强制转换后将变量转换为枚举

时间:2018-06-07 21:38:45

标签: c++ c++11 enums

是否可以通过引用将static_cast变量强制转换为函数而无需声明枚举。

bool GetTest(enumTests &e_Test)
{
 //do something with test
}

enum enumTests
{
Test1 = 1,
Test2,
};

/* The below does NOT compile*/
int i = 1;
GetTest(static_cast<enumTests>(i));

/* The below compiles*/
enumTests e_Test = static_cast<enumTests>(i);
GetTest(e_Test);

错误

  

20:34:错误:类型的非const引用的初始化无效   'enumTests&安培;'来自'enumTests'类型的右值

2 个答案:

答案 0 :(得分:2)

enumTests e_Test = static_cast<enumTests>(i);
GetTest(e_Test);
i = static_cast<int>(e_Test);

是正确的方法。

以下编译,但遗憾的是,违反了严格的别名规则,因此是UB:

static_assert(std::is_same<decltype(i), std::underlying_type_t<enumTests>>::value);
GetTest(reinterpret_cast<enumTests&>(i)); // Compile but is UB

答案 1 :(得分:1)

您正在尝试将rvalue值绑定到非const引用。因此,您需要额外的变量将其作为左值传递。 请参阅https://en.cppreference.com/w/cpp/language/value_category以了解左值和右值是什么。

但是如图所示,不需要static_cast。

#include <iostream>

enum enumTests
{
    Test1 = 1,
    Test2,
};

bool GetTest(enumTests &e_Test)
{
    e_Test = Test2;
    return false;
 //do something with test
}

int main()
{
    int i = 1;
    auto ie = enumTests(i);
    GetTest(ie);

    std::cout << ie;
    i = ie;
    std::cout << i;
}