Re[10]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 15:59
Оценка:
Здравствуйте, igna, Вы писали:

I>Может, не может... В стандарте его просто нет.

тем более глупость

Здравствуйте, Alexander G, Вы писали:

AG>Если бы это было задумано, const вариант был бы консистентен:

Вы ровно то написали что Matthew Wilson а консистентен не может быть ибо get_ptr свободная функция
Re[2]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 16:01
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Я считаю, просто дело привычки писать две версии в подобных случаях, написано неправильно "на автомате".


Я почти готов этому поверить, но все же:

1) Там же, рядом, есть перегрузка для comstl::interface_ptr<T>& и для нее второй версии нет.
2) auto_ptr это auto_ptr
3) А Matthew Wilson это Matthew Wilson
Re[11]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 16:04
Оценка:
Здравствуйте, Programador, Вы писали:

P>тем более глупость


Не, глупость это вот:

в исходном может зваться простой T T::get()

Re[11]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 16:07
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, Alexander G, Вы писали:


AG>>Если бы это было задумано, const вариант был бы консистентен:

P>Вы ровно то написали что Matthew Wilson а консистентен не может быть ибо get_ptr свободная функция

Твое сообщение попало не туда, но я все же отвечу.

Так вот, не то он написал, не то. Ну код то ведь несколько строчек всего, можно ведь и по буквам сравнить, если глаз не наметан.
Re[12]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 16:11
Оценка:
Здравствуйте, igna, Вы писали:

I>

I>в исходном может зваться простой T T::get()

Не придал значения что там чтото конкретное. std::auto_ptr кривой и менялась дисциплина владения при присвоении
Re[13]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 16:13
Оценка:
Здравствуйте, Programador, Вы писали:

P>Не придал значения что там чтото конкретное. std::auto_ptr кривой и менялась дисциплина владения при присвоении


"Дисциплина владения при присвоении" — это что? Есть оригинальный английский термин?
Re[3]: Wilson и auto_ptr
От: Alexander G Украина  
Дата: 28.08.09 16:15
Оценка:
Здравствуйте, igna, Вы писали:


I>2) auto_ptr это auto_ptr

Ээ не заметил, думал о смарт-поинтере вообще...

Для auto_ptr больше контекста нужно.

Если это обощённая штука, как boost::get_pointer, то явно там неправильно.
Русский военный корабль идёт ко дну!
Re[14]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 16:18
Оценка:
Здравствуйте, igna, Вы писали:

I>"Дисциплина владения при присвоении" — это что? Есть оригинальный английский термин?

Флажочек кто должен сам обьект разрушить когда сам разрушится. У МС и в стандарте было по разному одно время.
Re[15]: Wilson и auto_ptr
От: igna Россия  
Дата: 28.08.09 16:27
Оценка:
Здравствуйте, Programador, Вы писали:

P>Флажочек кто должен сам обьект разрушить когда сам разрушится. У МС и в стандарте было по разному одно время.


И у кого был "простой T T::get()"?
Re: Wilson и auto_ptr
От: saproj  
Дата: 28.08.09 17:02
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

I>В чем смысл этой перегрузки, почему вместо двух шаблонов не использовать один?:


I>
I>template <typename T>
I>inline T *get_ptr(std::auto_ptr<T> const &p)
I>{
I>  return p.get();
I>}
I>


В том, чтобы не дать такому коду скомпилиться:
const auto_ptr<int>ap(new int(123));
int*p=get_ptr(ap);
Re: Wilson и auto_ptr
От: Кодт Россия  
Дата: 28.08.09 17:23
Оценка:
Здравствуйте, igna, Вы писали:

I>Читаю книгу Matthew Wilson, Imperfect C++ и на странице 344 вижу такой код:


Это не защита от дурака, а непонятно зачем сделанное углубление константности.

Обычно у указателей (голых, а вслед за ними и умных) семантика поверхностной константности (shallow constness).
В то же время у агрегатов — семантика глубокой константности (deep constness).
class Foo : Base // у базы - нужная нам семантика агрегата
{
public:
    // у члена - нужная нам семантика агрегата
    Bar bar;
    
private:
    // у агрегата, размещённого в куче - к сожалению, ещё нет...
    Buz* buz;
public:
    // придётся делать вручную
    Buz*       get_buz()       { return buz; }
    Buz const* get_buz() const { return buz; }

public:
    // у ссылок на сторонние объекты - не мы отвечаем за константность, не нам их и менять
    Xyz*       xyz1;
    Xyz const* xyz2;
    
    Foo() : buz(new Buz()) {}
};


Но если нужен умный указатель с глубокой константностью — то логичнее было бы сделать именно его, вместо того, чтобы придумывать внешнюю функцию доступа с вот такой семантикой.

Вообще же, функции оголения указателей используются для обобщения работы с голыми и умными указателями
template<class T> T* get_ptr(T* p) { return p; }
template<class T> T* get_ptr(auto_ptr<T> const& p) { return p.get(); }
template<class T> T* get_ptr(shared_ptr<T> const& p) { return p.get(); }
.....

В данном случае пришлось бы писать
template<class T> T*       get_deep(T*&       p) { return p; }
template<class T> T const* get_deep(T*& const p) { return p; }
// и аналогично для умных

Если такой код встречается рядом — значит, разработчик молодец. Если нет — скорее всего, он чего-то недопонял.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[2]: Wilson и auto_ptr
От: makes Россия  
Дата: 28.08.09 17:24
Оценка:
Здравствуйте, saproj, Вы писали:

S>В том, чтобы не дать такому коду скомпилиться:
S>const auto_ptr<int>ap(new int(123));
S>int*p=get_ptr(ap);
S>


Нормально он компилится!
Re[2]: Wilson и auto_ptr
От: Кодт Россия  
Дата: 28.08.09 17:25
Оценка: 1 (1)
Здравствуйте, saproj, Вы писали:

S>В том, чтобы не дать такому коду скомпилиться:
S>const auto_ptr<int>ap(new int(123));
S>int*p=get_ptr(ap);
S>


Казалось бы, достаточно сделать
auto_ptr<const int> ap(new int(123));
int* p = ap.get();
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[3]: Wilson и auto_ptr
От: Programador  
Дата: 28.08.09 17:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Казалось бы, достаточно сделать

К>
К>auto_ptr<const int> ap(new int(123));
К>int* p = ap.get();
К>


оно какойто другой эффект имеет
const  std::auto_ptr<int>   ap(new int(123));
++*ap;

компилируется, а
std::auto_ptr<const int>   ap(new int(123));
++*ap;
нет
Re[2]: Wilson и auto_ptr
От: Erop Россия  
Дата: 28.08.09 17:54
Оценка:
Здравствуйте, Alexander G, Вы писали:


AG>
AG>template <typename T>
AG>inline T * const get_ptr(std::auto_ptr<T> const &p)
AG>{
AG>  return p.get();
AG>}
AG>


А какой в этом смысл? Чем rvalue T* отличается от Т*const ?


AG>или

AG>
AG>template <typename T>
AG>inline T const *get_ptr(std::auto_ptr<T const > &p)
AG>

А это совсем бессмысленно, так как T const -- это всего лишь один из частных случаев T

AG>, но ни один из этих вариантов смысла не имеет.

И как такое можно написать "подумав"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Wilson и auto_ptr
От: Lorenzo_LAMAS  
Дата: 28.08.09 18:07
Оценка:
M>Нормально он компилится!
Разве?

"ComeauTest.c", line 17: error: a value of type "const int *" cannot be used to
initialize an entity of type "int *"
int*p=get_ptr(ap);
^

1 error detected in the compilation of "ComeauTest.c".


c.cpp: In function 'int main()':
c.cpp:17: error: invalid conversion from 'const int*' to 'int*'

Of course, the code must be complete enough to compile and link.
Re[4]: Wilson и auto_ptr
От: Кодт Россия  
Дата: 28.08.09 18:08
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, Кодт, Вы писали:


P>оно какойто другой эффект имеет

P>
const  std::auto_ptr<int>   ap(new int(123));
P>++*ap;
P>

P>компилируется, а
P>
std::auto_ptr<const int>   ap(new int(123));
P>++*ap;
P>
нет


Ровно тот же самый эффект.
Умный указатель на константу приводится к голому указателю на константу (.get()) и разыменовывается в ссылку на константу (.operator*()).
Естественно, что над константой нет оператора автоинкремента.

Или ты хочешь сказать, что код
int* p = auto_ptr<const int>(new int(123));

удачно скомпилировался?!
Ну, выкини в топку свою версию STL, что ли.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[4]: Wilson и auto_ptr
От: makes Россия  
Дата: 28.08.09 18:38
Оценка: -1
Здравствуйте, Lorenzo_LAMAS, Вы писали:

M>>Нормально он компилится!

L_L>Разве?

а MSVC2005 съел и не подавился:
#include <memory>

template <typename T>
inline T *get_ptr(std::auto_ptr<T> const &p)
{
  return p.get();
}

int main()
{
    const std::auto_ptr<int> ap(new int(123));
    int*p=get_ptr(ap);
    return 0;
}
Re[5]: Wilson и auto_ptr
От: Lorenzo_LAMAS  
Дата: 28.08.09 18:52
Оценка:
Ты, я вижу, даже не попытался понять, кому и на что ответил saproj. Возьми исходный пример автора топика, который много мудро рассуждает и не заметил в итоге простых вещей, дополни его кодом saproj и компили.

И я не понимаю, это у меня с недосыпа с головой что-то и я не заметил чего-то, или тут, в этом флеймище люди о каком-то другом языке программирования рассуждают? Какие-то консты в параметры шаблона суют, еще чего-то, историю авто птр вспоминают. Вот вам конкретный пример привели, когда код игны не эквивалентен коду Вилсона или как там его.
Of course, the code must be complete enough to compile and link.
Re[3]: Wilson и auto_ptr
От: Alexander G Украина  
Дата: 28.08.09 19:41
Оценка:
Здравствуйте, Erop, Вы писали:

E>А какой в этом смысл? Чем rvalue T* отличается от Т*const ?

+
тут та самая тонкость, что int * const f() и int * f() — одна и та же функция.

E>А это совсем бессмысленно, так как T const -- это всего лишь один из частных случаев T

+

AG>>, но ни один из этих вариантов смысла не имеет.

E>И как такое можно написать "подумав"?

Я ж и говорю, что даже не опечатка, а просто написано не подумав
Русский военный корабль идёт ко дну!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.