Здравствуйте, igna, Вы писали:
I>Может, не может... В стандарте его просто нет.
тем более глупость
Здравствуйте, Alexander G, Вы писали:
AG>Если бы это было задумано, const вариант был бы консистентен:
Вы ровно то написали что Matthew Wilson а консистентен не может быть ибо get_ptr свободная функция
Здравствуйте, Alexander G, Вы писали:
AG>Я считаю, просто дело привычки писать две версии в подобных случаях, написано неправильно "на автомате".
Я почти готов этому поверить, но все же:
1) Там же, рядом, есть перегрузка для comstl::interface_ptr<T>& и для нее второй версии нет.
2) auto_ptr это auto_ptr
3) А Matthew Wilson это Matthew Wilson
Здравствуйте, Programador, Вы писали:
P>Здравствуйте, Alexander G, Вы писали:
AG>>Если бы это было задумано, const вариант был бы консистентен: P>Вы ровно то написали что Matthew Wilson а консистентен не может быть ибо get_ptr свободная функция
Твое сообщение попало не туда, но я все же отвечу.
Так вот, не то он написал, не то. Ну код то ведь несколько строчек всего, можно ведь и по буквам сравнить, если глаз не наметан.
Здравствуйте, Programador, Вы писали:
P>Не придал значения что там чтото конкретное. std::auto_ptr кривой и менялась дисциплина владения при присвоении
"Дисциплина владения при присвоении" — это что? Есть оригинальный английский термин?
Здравствуйте, igna, Вы писали:
I>"Дисциплина владения при присвоении" — это что? Есть оригинальный английский термин?
Флажочек кто должен сам обьект разрушить когда сам разрушится. У МС и в стандарте было по разному одно время.
Здравствуйте, 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()) {}
};
Но если нужен умный указатель с глубокой константностью — то логичнее было бы сделать именно его, вместо того, чтобы придумывать внешнюю функцию доступа с вот такой семантикой.
Вообще же, функции оголения указателей используются для обобщения работы с голыми и умными указателями
А какой в этом смысл? Чем 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>, но ни один из этих вариантов смысла не имеет.
И как такое можно написать "подумав"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Ровно тот же самый эффект.
Умный указатель на константу приводится к голому указателю на константу (.get()) и разыменовывается в ссылку на константу (.operator*()).
Естественно, что над константой нет оператора автоинкремента.
Или ты хочешь сказать, что код
int* p = auto_ptr<const int>(new int(123));
удачно скомпилировался?!
Ну, выкини в топку свою версию STL, что ли.
Ты, я вижу, даже не попытался понять, кому и на что ответил saproj. Возьми исходный пример автора топика, который много мудро рассуждает и не заметил в итоге простых вещей, дополни его кодом saproj и компили.
И я не понимаю, это у меня с недосыпа с головой что-то и я не заметил чего-то, или тут, в этом флеймище люди о каком-то другом языке программирования рассуждают? Какие-то консты в параметры шаблона суют, еще чего-то, историю авто птр вспоминают. Вот вам конкретный пример привели, когда код игны не эквивалентен коду Вилсона или как там его.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Erop, Вы писали:
E>А какой в этом смысл? Чем rvalue T* отличается от Т*const ?
+
тут та самая тонкость, что int * const f() и int * f() — одна и та же функция.
E>А это совсем бессмысленно, так как T const -- это всего лишь один из частных случаев T
+
AG>>, но ни один из этих вариантов смысла не имеет. E>И как такое можно написать "подумав"?
Я ж и говорю, что даже не опечатка, а просто написано не подумав