Почему я не могу использовать static_cast & lt; int & amp; & gt; передать целочисленный ссылочный параметр функции в C ++?

У меня есть параметр enum в программе на C ++, который мне нужно получить с помощью функции, которая возвращает значение через параметр. Я начал с объявления его как int, но при проверке кода попросили ввести его как enum (ControlSource). Я сделал это, но это нарушает функцию Get () — я заметил, что C-стиль приведен к int& решает проблему, но когда я впервые попытался ее исправить с помощью static_cast<> это не компилируется.

Почему это так, и почему когда eTimeSource был int, вообще не требуется приведение для передачи целого числа по ссылке?

//GetCuePropertyValue signature is (int cueId, int propertyId, int& value);

ControlSource eTimeSource = ControlSource::NoSource;

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, static_cast<int&>(eTimeSource)); //This doesn't work.

pPlayback->GetCuePropertyValue(programmerIds.cueId, DEF_PLAYBACKCUEPROPERTY_DELAY_SOURCE, (int&)(eTimeSource)); //This does work.

int nTimeSource = 0;
pPlayback->GetCuePropertyValue(blah, blah, nTimeSource); //Works, but no (int&) needed... why?

9

Решение

Когда вы конвертируете переменную в значение другого типа, вы получаете временное значение, которое не может быть связано с непостоянной ссылкой: бессмысленно изменять временное значение.

Если вам просто нужно читать значение константы должно быть в порядке:

static_cast<int const &>(eTimeSource)

Но вы могли бы просто создать фактическое значение, а не ссылку:

static_cast<int>(eTimeSource)
8

Другие решения

static_cast<int&>((eTimeSource))); //This doesn't work.

Да, это не работает, потому что eTimeSource это не int так что вы не можете связать int& к этому.

(int&)((eTimeSource))); //This does work.

Неправильно, это тоже не работает, просто кажется. Приведение в стиле C лежит на компиляторе и говорит «просто сделайте его таким, даже если это не разрешено». То, что что-то компилируется, не означает, что это работает.

почему когда eTimeSource был int не требуется литье для передачи целого числа по ссылке?

Потому что вы можете связать int& для int но не для другого типа, а eTimeSource это другой тип. int& это ссылка на int, Если бы вы могли связать его с другим типом, это не относится к intне так ли?

Если рецензент кода сказал, чтобы изменить переменную на тип перечисления, они, вероятно, также означали, что вы изменили параметр функции, чтобы принять ControlSource&

3

По вопросам рекламы [email protected]