У меня есть параметр 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?
Когда вы конвертируете переменную в значение другого типа, вы получаете временное значение, которое не может быть связано с непостоянной ссылкой: бессмысленно изменять временное значение.
Если вам просто нужно читать значение константы должно быть в порядке:
static_cast<int const &>(eTimeSource)
Но вы могли бы просто создать фактическое значение, а не ссылку:
static_cast<int>(eTimeSource)
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&