簡體   English   中英

靜態轉換后將變量轉換為枚舉

[英]cast variable to enum after static cast

是否可以通過引用將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:錯誤:從類型'enumTests'的右值對'enumTests&'類型的非常量引用進行了無效的初始化

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

是正確的方法。

following會編譯,但不幸的是,打破了嚴格的別名規則,UB也是如此:

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

您正在嘗試將右值綁定到非常量引用。 因此,您需要額外的變量將其作為左值傳遞。 請參閱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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM