приведенный интегральный тип, передаваемый по ссылке

#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 …