Правило 52. Копируйте и ликвидируйте согласованно
Сильно смутил последний абзац. Цитирую:
"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."
Собственно, почему это ошибочно? Я то наоборот считал например такой код очень хорошим:
Ytz пишет:
> Собственно, почему это ошибочно? Я то наоборот считал например такой код
Оператор присваивания не напишешь. Ну т.е. возможно не всегда напишешь.
Ссылку пересослать на что-то другое невозможно.
Хотя, с другой стороны, можно использовать конструктор и placement new ...
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Прокомментируйте правило 52 из книги Саттера и Алекса
Здравствуйте, MasterZiv, Вы писали:
MZ>Ytz пишет:
>> Собственно, почему это ошибочно? Я то наоборот считал например такой код
MZ>Оператор присваивания не напишешь. Ну т.е. возможно не всегда напишешь. MZ>Ссылку пересослать на что-то другое невозможно. MZ>Хотя, с другой стороны, можно использовать конструктор и placement new ...
Так это наоборот можно использовать как полезный прием. Например, при использовании идиомы pImpl. Использование auto_ptr в этом случае вынуждает либо выполнить глубокое копирование в копирующем операторе присваивания, либо явно запретить его.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Прокомментируйте правило 52 из книги Саттера и Александр
Здравствуйте, Ytz, Вы писали:
Ytz>Правило 52. Копируйте и ликвидируйте согласованно Ytz>Сильно смутил последний абзац. Цитирую: Ytz>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно." Ytz>Собственно, почему это ошибочно? Я то наоборот считал например такой код очень хорошим:
Ytz>
Здравствуйте, Ytz, Вы писали:
Ytz>Правило 52. Копируйте и ликвидируйте согласованно Ytz>Сильно смутил последний абзац. Цитирую: Ytz>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."
Может, какой-то дефект перевода? Оригинал бы глянуть.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: Прокомментируйте правило 52 из книги Саттера и Алекса
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Ytz, Вы писали:
Ytz>>Правило 52. Копируйте и ликвидируйте согласованно Ytz>>Сильно смутил последний абзац. Цитирую: Ytz>>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно."
R>Может, какой-то дефект перевода? Оригинал бы глянуть.
In a class holding a reference or an auto_ptr, you likely need to write the copy constructor and the assignment operator, but the default destructor already does the right thing. (Note that using a reference or auto_ptr member is almost always wrong.)
Re: Прокомментируйте правило 52 из книги Саттера и Александр
Здравствуйте, Ytz, Вы писали:
Ytz>Правило 52. Копируйте и ликвидируйте согласованно Ytz>Сильно смутил последний абзац. Цитирую: Ytz>"В классе, хранящем ссылку или auto_ptr, вам вероятно придется написать копирующий конструктор. Заметим, что использование члена, являющегося ссылкой или auto_ptr, почти всегда ошибочно." Ytz>Собственно, почему это ошибочно? Я то наоборот считал например такой код очень хорошим:
Ytz>
У auto_ptr довольно своеобразная семантика копирования — передача владения. Собственно, он заточен для возврата "жирных" значений из функций. Для пользовательских классов такое поведение требуется крайне редко, потому и написано, что скорее всего ошибка. Обычно подходят boost::scoped_ptr (при этом конструктор копирования и оператор присваивания автоматичски идут нафиг), либо shared_ptr/intrusive_ptr — с ними, понятное дело, будет и дефолтное копирование с подсчетом ссылок.
У auto_ptr есть еще одна особенность, которая делает его полезным — наличие функции release. Что позволяет организовать, например, передачу владения во время многостадийной инициализации, типа такого:
class C
{
boost::scoped_ptr<A> a;
boost::scoped_ptr<B> b;
public:
C(A *a, B *b) : a(a), b(b) {}
};
void foo()
{
std::auto_ptr<A> a(new A());
std::auto_ptr<B> b(new B());
C c(a.release(), b.release());
}
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.