Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Константные ссылки на временные объекты. А почему именно константные? 
:(
    Опции темы
Hassel
Дата 11.7.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



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

std::string s1;
std::string s2;

const std::string &s3 = s1 + s2;
при этом время жизни временного объекта автоматически привязывается к времени жизни самой ссылки.

Вопрос в следующем: а почему только константные ссылки? Почему нельзя создавать неконстантные ссылки?
PM MAIL   Вверх
azesmcar
Дата 11.7.2011, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Hassel @  11.7.2011,  10:56 Найти цитируемый пост)
Вопрос в следующем: а почему только константные ссылки? Почему нельзя создавать неконстантные ссылки? 

а если ты модифицируешь объект, что должно быть модифицировано?
PM   Вверх
baldina
Дата 11.7.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Hassel @  11.7.2011,  10:56 Найти цитируемый пост)
Почему нельзя создавать неконстантные ссылки? 

можно. создавай smile

Добавлено @ 11:12
почитай http://alenacpp.blogspot.com/2005/11/sequence-points.html

Это сообщение отредактировал(а) baldina - 11.7.2011, 11:12
PM MAIL   Вверх
mes
Дата 11.7.2011, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Hassel @  11.7.2011,  09:56 Найти цитируемый пост)
 а почему только константные ссылки? Почему нельзя создавать неконстантные ссылки? 

потому что это, увы как многое в стандарте, костыль ..




--------------------
PM MAIL WWW   Вверх
Hassel
Дата 11.7.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



Цитата(azesmcar @ 11.7.2011,  10:57)
а если ты модифицируешь объект, что должно быть модифицировано?

Должно быть модифицировано значение "временного" объекта. Он ведь по-сути уже перестал быть временным. Везде четко написано - время жизни такого объекта совпадает с временем жизни ссылки (за исключением случая с аргументом конструктора). Т.е. я могу относиться к такому временному объекту, как к локальной переменной, объявленной в той же области видимости, что и ссылка.

Цитата(baldina @ 11.7.2011,  11:09)
почитай http://alenacpp.blogspot.com/2005/11/sequence-points.html?

Честно дочитал до конца, но не очень понял.

Я все-таки не понимаю, раз объект перестал быть временным, почему его значение нельзя изменять? Чем вызвано это ограничение?

PM MAIL   Вверх
baldina
Дата 11.7.2011, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Hassel @  11.7.2011,  13:54 Найти цитируемый пост)
Честно дочитал до конца, но не очень понял.

там про временные объекты и их время жизни. ладно, не суть
там же есть еще обсуждение константных ссылок http://alenacpp.blogspot.com/2008/01/const.html
вопрос "почему" более тонкий; в большинстве случаев можно обойтись просто переменной, не ссылкой.
однако рассматривая код
Код

const int& ten = 10;

и принимая во внимание, что ссылка - синоним объекта, согласитесь, здесь возможность изменения была бы нелогичной
(хотя технически возможно, используя const_cast)
PM MAIL   Вверх
mes
Дата 11.7.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



ссылка - lvalue , если ей без проблем можно присваивать rvalue, то само понятие rvalue становится лишним... 



--------------------
PM MAIL WWW   Вверх
baldina
Дата 11.7.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



да, но почему временный объект обязательно rvalue? никаких серьезных причин этому ограничению я не вижу
PM MAIL   Вверх
Hassel
Дата 11.7.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



Я думаю, что правильный ответ - временный объект по своему назначению относится именно к rvalue. Он для того и создается, чтобы быть rvalue. Судя по всему, что обсуждалось выше, саму возможность получения ссылки на такой объект нужно рассматривать как некоторое отклонение от концепции "временности" .

Это сообщение отредактировал(а) Hassel - 11.7.2011, 16:02
PM MAIL   Вверх
baldina
Дата 11.7.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



думаю тут есть две разные ситуации.
Код

const int& ten = 10; // здесь 10 очевидно имеет тип const int
const string& s = s1+s2; // а почему здесь результат s1+s2 должен быть константой, совсем не ясно

вобщем про костыли поддерживаю)

Добавлено через 2 минуты и 7 секунд
с другой стороны, ссылка есть не что иное, как средство оптимизации. так что семантику ссылки не расширяют, обойтись без них можно, а во многих случаях компилятор сам разберется как лучше сделать
PM MAIL   Вверх
Hassel
Дата 11.7.2011, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.1.2011
Где: Москва

Репутация: нет
Всего: нет



Вот, кстати, тот-же самый вопрос и очень подробно http://stackoverflow.com/questions/1565600...emporary-object.
Позволю себе немного процитировать:
Код

Anyway, based on your question and comments I don't think even these extra answers will satisfy you.
Here is a final attempt/summary: The C++ committee decided it doesn't make sense to modify temporaries,
therefore, they disallowed binding to non-const references. May be some compiler implementation
or historic issues were also involved, I don't know. Then, some specific case emerged, and it was decided that against all odds,
they will still allow direct modification through calling non-const method.
But that's an exception - you are generally not allowed to modify temporaries. Yes, C++ is often that weird.


Это сообщение отредактировал(а) Hassel - 11.7.2011, 16:12
PM MAIL   Вверх
mes
Дата 11.7.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(baldina @  11.7.2011,  14:47 Найти цитируемый пост)
да, но почему временный объект обязательно rvalue?

не обязательно smile.. но жизнь объекта продливается при пристыковке rvalue к константной ссылке.. 
само понятие временный объект в данном аспекте вторично.. 
smile

Добавлено через 2 минуты и 47 секунд
Цитата(baldina @  11.7.2011,  14:47 Найти цитируемый пост)
никаких серьезных причин этому ограничению я не вижу 

ну студия сделала и этим перевела широкий ряд легко диагностируемых компитором ошибок в разряд трудноуловливаемых программистом багов..  smile

Добавлено через 4 минуты и 57 секунд
Цитата(baldina @  11.7.2011,  15:00 Найти цитируемый пост)
здесь 10 очевидно имеет тип const int

а то что const int - lvalue не сильно смущает ?


--------------------
PM MAIL WWW   Вверх
baldina
Дата 12.7.2011, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(mes @  11.7.2011,  20:52 Найти цитируемый пост)
а то что const int - lvalue не сильно смущает ? 

с чего это оно lvalue? или это из разряда "если бы"?
ссылки дань оптимизации (повторяюсь?) в виде синтаксического сахара. только он мог бы быть и послаще))) впрочем от языка с такой историей и идеологией трудно ожидать революций, так что - и так хорошо)))

PM MAIL   Вверх
mes
Дата 12.7.2011, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(baldina @  12.7.2011,  08:30 Найти цитируемый пост)
с чего это оно lvalue? или это из разряда "если бы"?

а там const int , sorry я проассоциировал вторую часть цитаты на первую и речь вел о const int&, а она всегда lvalue.. 
но тогда еще раз вернемся к цитате.. 

Цитата

Код

const int& ten = 10; // здесь 10 очевидно имеет тип const int
const string& s = s1+s2; // а почему здесь результат s1+s2 должен быть const


как связано const в цитате и rvalue ?!



Это сообщение отредактировал(а) mes - 12.7.2011, 12:12


--------------------
PM MAIL WWW   Вверх
baldina
Дата 12.7.2011, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



я неявно имел в виду non-modifiable lvalues. lvalue в смысле 'объект с адресом' или 'слева от =' не так интересно. тут интересна операция присваивания, а не инициализации.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0888 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.