![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
Добрый день.
Можно ли сделать/объявить действительно константную ссылку? т.е. я сейчас делаю так: const std::vector<int>& SomeFunction(); и, соответственно: const std::vector<int>& data = SomeFunction(); но компилятор пропускает data.clear(); этого можно как-то избежать? Заранее благодарю за ответ. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Спецификатор const в обьявлении обьекта(переменной, ссылки, указателя) указывает компилятору, что изменять состояние обьекта нельзя (т.е. его следует рассматривать как read-only)
Если вектор действительно нужно очистить, ссылку следует обьявить как
--------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
О, блин, сорри - показалось "компилятор НЕ пропускает...." Надо думать... --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
А если ссылку на константный обьект попробовать?
--------------------
|
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Каким компилятором ты пользуешься?
VC6 и выше вызов clear() для констатной ссылки на объект не пропускает, сообщая при этом, что не может конвертнуть this-указатель констатного объекта в неконстантный
--------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Ты где то ошибся.
Пытаюсь скомпилировать следующий код:
Получаю ошибку:
Так что константная ссылка действительно константна. -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
ИМХО, вопрос реализации и версии STL. На других платформах может быть иначе. |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
_hunter, а ты случаем Borland'овский компилер юзаешь? Я слышал, у него бывают заскоки по фазе...
Вообще я согласен с DENNN'ом --------------------
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
ССылка то константна, но вот получить по этой ссылке доступ к методам класса ты можешь - > нет никакой гарантии что вызванный метод не изменит свои внутренние данные. |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Если я не ошибаюсь, методу константного обьекта класса передается константный this и компилер плюется при попытке изменить данные. --------------------
|
||||
|
|||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Для константного объекта данные-члены доступны только на чтение, а из функций-членов доступны только опять-таки константные (т.е. определённые с модификатором const) и статические. Из константных методов менять можно только статические поля и поля со спецификатором mutable, а из статических методов - только статические поля. Так-что гарантия есть.
Не может. Если реализация STL соответствует стандарту, то в ней метод clear() вектора не имеет модификатора const, а значит этот метод не может быть вызван для константных объектов. -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
стандарт языка с++ (наверное любой номер) говорит о том, что
А зачем возвращать const ссылку если пользователь твоей функции её только смотрит? Может имеет смысл вернуть копию объекта? Или это экономия памяти? Это сообщение отредактировал(а) np9mi7 - 8.4.2005, 14:58 |
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Я ж и говорю, билдерь наверное.. Сейчас придет _Хантер и расскажет --------------------
|
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
сорри что так поздно пришел...
действительно пишу под билдером ( если это его прикол -- обидно np9mi7, не столько памяти сколько времени ( у меня этих чтений -- туева хуча ) полный код ( чтобы не было вопросов ):
и единственное, что мне на это говорит компилятор: [C++ Warning] W8037 Non-const function _STL::vector<int,_STL::allocator<int> >::clear() called for const object и все -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Значит билдерь пропускает константные вызовы, из еррора превращая их в ворнинги.
--------------------
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |