приведение переменной к enum после статического приведения - PullRequest
0 голосов
/ 08 июня 2018

Возможно ли преобразовать переменную 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'

Ответы [ 2 ]

0 голосов
/ 08 июня 2018
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
0 голосов
/ 08 июня 2018

Вы пытаетесь привязать значение rvalue к неконстантной ссылке.Так что вам нужна дополнительная переменная, передающая ее как lvalue.Пожалуйста, смотрите https://en.cppreference.com/w/cpp/language/value_category, чтобы понять, что такое lvalues ​​и rvalues.

Но для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...