#c #integer
#c #целое
Вопрос:
Если у вас есть интегральный тип t1 и функция, получающая возможно меньший интегральный тип t2 по ссылке, будет ли проблематично вызвать функцию((t2)var_t1)?
Комментарии:
1. C и Си — это разные языки. Я удалил тег C.
Ответ №1:
Было бы неплохо привести к t2
тогда и только тогда, когда функция принимает постоянную ссылку, и в этом случае временное значение, созданное приведением к t2
, могло бы быть привязано к нему.
Поскольку это противоречит цели ссылки на интегральный тип, я бы предположил, что ссылка является неконстантной, поэтому ответ: да, это было бы проблематично. Для ясности, он даже не будет компилироваться, если вы приведете его к t2
.
Если вы хотите function
изменить только части t1
переменной, используйте reinterpret_cast
для ссылки / указателя. Теоретически это, конечно, вызовет неопределенное поведение.
Комментарии:
1. Просто помните, что неопределенность такого поведения не так уж теоретична на платформах с большим конечным порядком, где это изменило бы неправильную часть переменной. Это правда, что платформы с большими конечными кодировками становятся все реже, но они определенно еще не исчезли.
2. Верно, но он так же не определен в большом конце, как и в маленьком конце. Но результаты должны быть предсказуемыми, если известна целевая архитектура, это то, что я имел в виду под «теоретическим». Конечно, это не делает его намного лучше …
Ответ №2:
Приведение создаст временный тип, и если меньший тип НЕ будет приниматься по const
ссылке, ваш код НЕ будет компилироваться, потому что временный тип не может быть привязан к неконстантной ссылке.
Если он принимает по const
ссылке, то он будет скомпилирован, но приведение может вызвать переполнение, что является обычной проблемой при приведении большего типа данных к меньшему.
Ответ №3:
Функция должна была бы принимать const
ссылку, иначе она не скомпилировалась бы.
Ответ №4:
Поскольку вы также отметили вопрос C, и в этом случае «по ссылке» означало бы просто использование указателя, вы не можете применить amp;
оператор к результату приведения. Однако вы могли бы использовать:
function((t2 [1]){ (t2)var });
Обратите внимание, что это допустимый C, но не C , одна из причин, по которой не следует смешивать теги C и C …