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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> действительно константная ссылка 
:(
    Опции темы
_hunter
  Дата 7.4.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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...
PM ICQ   Вверх
Fire-Plug
Дата 7.4.2005, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Спецификатор const в обьявлении обьекта(переменной, ссылки, указателя) указывает компилятору, что изменять состояние обьекта нельзя (т.е. его следует рассматривать как read-only)
Если вектор действительно нужно очистить, ссылку следует обьявить как
Код

std::vector<int>& data= const_cast <std::vector<int>&>(SomeFunction());

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Fire-Plug
Дата 7.4.2005, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Цитата(_hunter @ 7.4.2005, 22:10)
но компилятор пропускает data.clear();


О, блин, сорри - показалось "компилятор НЕ пропускает...."
Надо думать...
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
chipset
Дата 8.4.2005, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



А если ссылку на константный обьект попробовать?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Fire-Plug
Дата 8.4.2005, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: -1
Всего: 0



Каким компилятором ты пользуешься?
VC6 и выше вызов clear() для констатной ссылки на объект не пропускает, сообщая при этом, что не может конвертнуть this-указатель констатного объекта в неконстантный
Код

vector<int> vInt; // как-то инициализирован
 . . . 
const vector<int>& сrVect= vInt;
сrVect.clear();
=====
error C2662: 'clear' : cannot convert 'this' pointer from 'const class std::vector<int,class std::allocator<int> >'
to 'class std::vector<int,class std::allocator<int> > &'

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
srd
Дата 8.4.2005, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Ты где то ошибся.
Пытаюсь скомпилировать следующий код:
Код

#include <vector>

std::vector<int> vector;

const std::vector<int> &SomeFunction(void)
{
    return vector;
}


int main(void)
{
    const std::vector<int> &v = SomeFunction();
    v.clear();
    return 0;
}

Получаю ошибку:
Цитата

d:\documents\Visual Studio Projects\tst\main.cpp(14): error C2662: 'std::vector<_Ty>::clear' : cannot convert 'this' pointer from 'const std::vector<_Ty>' to 'std::vector<_Ty> &'
        with
        [
            _Ty=int
        ]
        and
        [
            _Ty=int
        ]
        and
        [
            _Ty=int
        ]

Так что константная ссылка действительно константна.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
DENNN
Дата 8.4.2005, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Fire @ 8.4.2005, 02:11)
VC6 и выше вызов clear() для констатной ссылки на объект не пропускает,

ИМХО, вопрос реализации и версии STL. На других платформах может быть иначе.
PM ICQ   Вверх
chipset
Дата 8.4.2005, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



_hunter, а ты случаем Borland'овский компилер юзаешь? Я слышал, у него бывают заскоки по фазе...
Вообще я согласен с DENNN'ом smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DENNN
Дата 8.4.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(srd @ 8.4.2005, 02:14)
Так что константная ссылка действительно константна.

ССылка то константна, но вот получить по этой ссылке доступ к методам класса ты можешь - > нет никакой гарантии что вызванный метод не изменит свои внутренние данные.
PM ICQ   Вверх
chipset
Дата 8.4.2005, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(DENNN @ 8.4.2005, 00:47)
ССылка то константна, но вот получить по этой ссылке доступ к методам класса ты можешь - > нет никакой гарантии что вызванный метод не изменит свои внутренние данные.

Если я не ошибаюсь, методу константного обьекта класса передается константный this и компилер плюется при попытке изменить данные.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
srd
Дата 8.4.2005, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Цитата(DENNN @ 8.4.2005, 17:47)
ССылка то константна, но вот получить по этой ссылке доступ к методам класса ты можешь - > нет никакой гарантии что вызванный метод не изменит свои внутренние данные.

Для константного объекта данные-члены доступны только на чтение, а из функций-членов доступны только опять-таки константные (т.е. определённые с модификатором const) и статические. Из константных методов менять можно только статические поля и поля со спецификатором mutable, а из статических методов - только статические поля. Так-что гарантия есть.

Цитата(DENNN @ 8.4.2005, 16:28)
ИМХО, вопрос реализации и версии STL. На других платформах может быть иначе.

Не может. Если реализация STL соответствует стандарту, то в ней метод clear() вектора не имеет модификатора const, а значит этот метод не может быть вызван для константных объектов.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
np9mi7
  Дата 8.4.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



стандарт языка с++ (наверное любой номер) говорит о том, что
Код

const T& a;
, объект на который ссылается так объявленная ссылка нельзя изменить. Чето где то глючит smile

А зачем возвращать const ссылку если пользователь твоей функции её только смотрит? Может имеет смысл вернуть копию объекта? Или это экономия памяти?

Это сообщение отредактировал(а) np9mi7 - 8.4.2005, 14:58


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
chipset
Дата 8.4.2005, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(np9mi7 @ 8.4.2005, 04:54)
Чето где то глючит smile

Я ж и говорю, билдерь наверное..
Сейчас придет _Хантер и расскажет smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
_hunter
Дата 8.4.2005, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



сорри что так поздно пришел...

действительно пишу под билдером ( если это его прикол -- обидно smile )

np9mi7, не столько памяти сколько времени ( у меня этих чтений -- туева хуча )

полный код ( чтобы не было вопросов ):

Код

#include <vector>
//---------------------------------------------------------------------------

class A
{
private:
    std::vector<int> _data;
public:
    const std::vector<int>& GetData();
};

const std::vector<int>& A::GetData()
{
    return _data;
}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    A a;

    const std::vector<int>& data = a.GetData();
    data.clear();

    return 0;
}
//---------------------------------------------------------------------------


и единственное, что мне на это говорит компилятор:
[C++ Warning] W8037 Non-const function _STL::vector<int,_STL::allocator<int> >::clear() called for const object
и все smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
chipset
Дата 8.4.2005, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Значит билдерь пропускает константные вызовы, из еррора превращая их в ворнинги.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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