Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 20:57   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Имеет, временные объекты умеют передаваться только по константной ссылке.
1. На самом деле, данный код прекрасно скомпилировался не только в 2008 студии, на и на следующих компляторах гцц:

C++ (gcc-4.3.4)
http://ideone.com/hWYM9


GCC-4.7.0 set as default compiler
http://liveworkspace.org/code/a5b3b6...2fd63494cefbeb

А вот на этом компиляторе произошла осечка:

C++: g++ 4.1.2
http://codepad.org/JSsjjgRF

И вопрос: в чем тут подвох, и чей косяк актуальный.
Что характерно - последний компиль является относительно старым.

2. Обрати внимание на сам код. Я добавил туда парочку методов для наглядности:

Код:
void Hello()const{ cout<<"Hello! I am const\n";  }
void Hello(){ cout<<"Hello! I am not const\n";  }
Предполагается, что если объект константный, то для него можно толкать только константные методы. Вопрос: а является ли временный объект константным? Я всегда думал, что - да.

Код:
(b++).Hello(); //здесь создаётся временный объект, для которого толкается метод.
Поскольку временный объекты являются константными, то логично предположить, что для них будет запущена константная версия метода.
Лично я очень удивлен. Ты можешь как то объяснить происходящее?

А уж коли объект не константный, то и не обязан бегать по константным ссылкам. Разве не так?

Ну и наконец, в коде:

Код:
 a=b++;//сначала создается временный объект
           //а потом для объекта a запускается operator=
Причем, правая часть выражения нормально компилируется на всех компиляторах. С ней проблем нет. Результатом правой части становится временный объект, который не считает себя константным.

Давайте проверим, когда именно тут срабатывает конструктор копии.
Для этого я определяю явный operator= с каутом, и в сам копирующий конструктор так же вставляю каут.

И мы увидим всю эту кухню при использовании тех компиляторов, которые способны прожевать этот код:

http://ideone.com/6bllO

Видно, что сработал только один копирующий конструктор ещё внутри метода. Когда метод отработал, можно предположить, что раз он возвращает по значению - запустится ещё один копирующий конструктор. Но этого почему то не произошло.

Потом сразу запускается operator= принимающий объект по константной ссылке.

Ну а теперь, самое главное, и касается вопроса ужаваемой Лето:

Старый компилятор. Смотрите:

http://codepad.org/G8tlCQKz

Я сделал человечный копирующий конструктор и все сразу скомпилировать. И о боже! Мы видим ещё один копирующий конструктор!
Причем перед самым запуском operator=

Это именно тот самый конструктор, который и создает временные объекты.
Которые хотя и считают себя почему то "не константными", но видимо передавать знание о них можно только по константным ссылкам. И они просят копирующие конструкторы, которые принимают по константным ссылкам.

А что касается новых компиляторов - возможно, учитывая что никаких дополнительных конструкторов у них не вызывается,(вероятно, там просто оптимизировали этот момент), то стало быть и константность ссылки в конструкторах не обязательна. Но это лишь мои догадки.

Последний раз редактировалось _Bers; 13.06.2012 в 21:05.
_Bers вне форума Ответить с цитированием
Старый 13.06.2012, 21:53   #12
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Видно, что сработал только один копирующий конструктор ещё внутри метода. Когда метод отработал, можно предположить, что раз он возвращает по значению - запустится ещё один копирующий конструктор. Но этого почему то не произошло.
Подозреваю, этого не произошло за счет RVO.

А вот про константные ссылки - рушит представление о мире.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с конструктором Merovingian Общие вопросы C/C++ 8 28.09.2011 14:55
Проблема с конструктором igor17 Общие вопросы C/C++ 13 15.05.2011 22:23
Макрос для копирования значений из нескольких файлов в один общий с определенным условием копирования zenner Microsoft Office Excel 0 21.03.2011 14:48
Что-то не так с конструктором Дырдин Общие вопросы C/C++ 7 26.03.2010 18:33
Помогите с конструктором girkoff Общие вопросы C/C++ 10 01.11.2009 16:01