Здравствуйте, Smal, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>да я его "от руки" написал, не компилил. А>>вопрос был теоретический, создаётся ли временный объект: А>>
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Smal, Вы писали:
S>>Здравствуйте, Аноним, Вы писали:
А>>>да я его "от руки" написал, не компилил. А>>>вопрос был теоретический, создаётся ли временный объект: А>>>
S>>Да, временный объект будет создан.
CS>Что такое "временный объект" в данном контексте?
Прошу прощения. Имелся ввиду случай с void f( char const & c ) {}
Тут действительно непонятно.
С уважением, Александр
Re[5]: Преобразование типов (создаётся временный объект?).
что будет в 'c'? Это хорошо если расположение байт перевёрнутое, и при приобразовании в меньшую сторону мы получим крайнее значение 0xFF, а если байтики хранятся сначало старшии, то получим 0x7F? ...в зависимости от платформы?
Re[6]: Преобразование типов (создаётся временный объект?).
_>что будет в 'c'? Это хорошо если расположение байт перевёрнутое, и при приобразовании в меньшую сторону мы получим крайнее значение 0xFF, а если байтики хранятся сначало старшии, то получим 0x7F? ...в зависимости от платформы?
4.7.3
If the destination type is signed, the value is unchanged if it can be represented in the destination type (and
bit-field width); otherwise, the value is implementation-defined.
С уважением, Александр
Re[6]: Преобразование типов (создаётся временный объект?).
_>что будет в 'c'? Это хорошо если расположение байт перевёрнутое, и при приобразовании в меньшую сторону мы получим крайнее значение 0xFF, а если байтики хранятся сначало старшии, то получим 0x7F? ...в зависимости от платформы?
Будьте внимательны — когда делается static_cast значения, а когда reinterpret_cast ссылки.
(char) — это static_cast. Значение типа short приводится к значению типа char и затем копируется в переменную c.
int и char — числовые типы, преобразование там арифметическое. Вообще говоря, здесь происходит целочисленное переполнение (поскольку 0x7FFF вылезло за границы CHAR_MIN..CHAR_MAX), но эта операция условно-безболезненна. Берётся остаток по модулю, сиречь младший байт.
(char&) — это реинтерпрет. Ссылка на объект типа short приводится к ссылке на объект типа char. Естественно, при этом мы уже забываем о содержимом, и работаем с байтовыми представлениями. Получаем первый байт, а является ли он младшим или старшим — зависит от архитектуры.
Перекуём баги на фичи!
Re[6]: Преобразование типов (создаётся временный объект?).
Здравствуйте, _alecs, Вы писали:
_>Здравствуйте, Smal, Вы писали:
S>>Прошу прощения. Имелся ввиду случай с void f( char const & c ) {} S>>Тут действительно непонятно.
_>Здесь действительно есть неопределённость...? создаст временный объект или воспримит передаваемый объект как char...?
Неопределённость с понятием временный объект.
void f( char const & c ) {} => создаст временный объект
void f( char c ) {} => не создаст, а просто приведет int к char и скопирует в переменную c
С уважением, Александр
Re[8]: Преобразование типов (создаётся временный объект?).
Здравствуйте, Smal, Вы писали:
S>void f( char const & c ) {} => создаст временный объект S>void f( char c ) {} => не создаст, а просто приведет int к char и скопирует в переменную c
А по подробней насчёт этой операции? Не является ли это созданием временного объекта?
Кстати, благодарю всех за ответы!
Re[8]: Преобразование типов (создаётся временный объект?).
Здравствуйте, Smal, Вы писали:
S>void f( char const & c ) {} => создаст временный объект S>void f( char c ) {} => не создаст, а просто приведет int к char и скопирует в переменную c
Следуя логиге этих двух примеров можно сказать следующее:
В случае отличии типа передоваемого значения от требуемого операция
(char)i; // i это int i;
приведет int к char -> т.е. создаст временный объект, и передаст его по ссылки
void f( char const & c ) {}
Re[9]: Преобразование типов (создаётся временный объект?).
Здравствуйте, _alecs, Вы писали:
_>Здравствуйте, Smal, Вы писали:
S>>void f( char const & c ) {} => создаст временный объект S>>void f( char c ) {} => не создаст, а просто приведет int к char и скопирует в переменную c
_>Следуя логиге этих двух примеров можно сказать следующее:
.... _>приведет int к char -> т.е. создаст временный объект, и передаст его по ссылки
не т.е.
приведет int к char, создаст временный объект типа char со значением (char)i,
и передаст ссылку на него в функцию void f( char const & c ) {}
Если же void f( char c ) {}, то приведет int к char и присвоит это значение переменной c
при вызове функции f
С уважением, Александр
Re: Преобразование типов (создаётся временный объект?).
Здравствуйте, Smal, Вы писали:
S>не т.е.
S>приведет int к char, создаст временный объект типа char со значением (char)i, S>...
Интересно, как это он приведёт допустим char к float без создания временного объекта??
Можно немного поподробней об операции приведения — приведет char к float?
Re[3]: Преобразование типов (создаётся временный объект?).