![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| manu |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 14.10.2004 Репутация: 2 Всего: 3 |
На эту фичу я наткнулся когда попытался запихнуть умные указатели в вектор. Т.е. есть у меня умный указатель:
template<class T> class ptr: public chain<T> { private: T *ptr; public: ptr(ptr<T> &p) { ... } ... }; В принципе, с первого взгляда понятно почему у конструктора копирования параметр не const. Мы же ведь не можем получить не константный указатель из константного. И мне нужно было сделать вектор этих вот указателей: class A { ... }; vector< ptr<A> > a; Но компилятор не дал мне сделать этот вектор. Дело в том, что у функции push_back() и подобных параметр константный. Т.е. если если нет конструктора копий вида ptr(const ptr<T> &p), то вектор мы использовать не можем! Тут у меня появилась гипотеза. На уровне интуиции. typedef int *ptr_t; ptr_t x=new int; const ptr_t& x1=x1; ptr_t x2=x1; VC++ 7.1 это компилирует! для меня это было откровением. В принципе все понятно. Наш reference константный, но указатель, к которому он относится не константый. Поэтому все теперь работает А конструктор у меня теперь такой: ptr(const ptr_t &p): chain_t(p.value,&p) { } Вот так вот. |
|||
|
||||
| manu |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 14.10.2004 Репутация: 2 Всего: 3 |
Интересно, что в реализации STL от P.J. Plauger'а из Visual C++ конструкторы auto_ptr выглядят так:
explicit auto_ptr( Type* _Ptr = 0 ) throw( ); auto_ptr( auto_ptr<Type>& _Right ) throw( ); auto_ptr( auto_ptr_ref<Type> _Right ) throw( ); template<class Other> auto_ptr( auto_ptr<Other>& _Right ) throw( ); |
|||
|
||||
| manu |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 14.10.2004 Репутация: 2 Всего: 3 |
Но самое интересное, что у Страуструпа конструктор такой: auto_ptr(const auto_ptr<T> &)!
|
|||
|
||||
| bel_nikita |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
manu
Не обязательно VC++ 7.1. Другие тоже будут компилировать Дело в том, что при использовании typedef int *ptr_t; у тебя уже не указатель на константу, а получается константный указатель. Пару поясняющих примеров и отличий константного указателя и указателя на константу:
Еще многие думаю, что:
Но как показывает практика - НЕТ |
||||||||||
|
|||||||||||
| alien_by |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 82 Регистрация: 29.11.2004 Где: Belarus/Gomel Репутация: нет Всего: 8 |
Вообще-то можем...
|
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |