Описание класса auto_ptr. Преобразования

   
На этом шаге мы рассмотрим различные преобразования, используемые в операциях присваивания и копирования.

   
Прочие члены класса auto_ptr (вспомогательный тип auto_ptr_ref и использующие его функции) реализуют довольно хитрые
преобразования, позволяющие выполнять операции копирования и присваивания только с неконстантными экземплярами auto_ptr.
Ниже приводится краткое пояснение. Необходимо обеспечить выполнение двух требований.

  • Объекты auto_ptr должны передаваться функциям и приниматься от них в виде r-значений.   Замечание.
    Термины "r-значение" и "l-значение" происходят от конструкции присваивания выражение1=выражеиие2,
    в которой левосторонний операнд выражение1 должен представлять собой (модифицируемое) l-значение. Тем не менее,
    l-значение правильнее представлять как значение определителя объекта, то есть выражение, определяющее объект по имени
    или адресу (указателю или ссылке). Эти значения не обязаны быть модифицируемыми; например, имя константного объекта является
    немодифицируемым l-значением. Все выражения, не относящиеся к l-значениям, являются r-значениями. В частности,
    временные объекты, создаваемые явно (Т())) или в результате вызова функции, являются r-значениями.

       
    Поскольку тип auto_ptr является классом, это должно делаться с применением конструктора.

  • При копировании auto_ptr исходный указатель должен лишаться права владения объектом, для чего копия должна модифицировать
    исходный экземпляр auto_ptr.

   
Обычный копирующий конструктор может скопировать r-значение, но для этого его параметр должен быть объявлен в виде ссылки на
константный объект. В случае использования обычного конструктора для копирования auto_ptr нам придется объявить переменную класса,
содержащую фактический указатель, изменяемой, чтобы ее можно было модифицировать в копирующем конструкторе. Но тогда вы сможете написать
код, который копирует объекты auto_ptr, объявленные константными; передача права владения противоречит объявлению этих объектов
константными.

   
Возможен и другой вариант - найти механизм, который бы позволял преобразовать r-значение в l-значение. Простая операторная
функция преобразования к ссылочному типу не подойдет, поскольку такие функции никогда не вызываются для преобразования объекта к его
собственному типу (вспомните, что атрибут "ссылочности" не является частью типа). По этой причине был введен класс auto_ptr_ref,
обеспечивающий механизм преобразования в l-значение. Работа этого механизма основана на различиях между перегрузкой (overloading)
и правилах идентификации аргументов в шаблонах. Эти различия слишком тонки, чтобы использовать их в качестве общего инструмента
программирования, но в данном случае они обеспечивают правильную работу класса auto_ptr.

   
Не удивляйтесь, если ваш компилятор еще не различает константные и неконстантные объекты auto_ptr. Также учтите, что в этом случае
работа с auto_ptr требует еще большей осторожности - малейшая невнимательность легко приводит к непредвиденной передаче прав владения.

   
На следующем шаге мы приведем пример реализации класса auto_ptr.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий