Вернемся к моему безумному AutoArray thingy ... (цитируем важные фрагменты оттуда:
class AutoArray
{
void * buffer;
public:
//Creates a new empty AutoArray
AutoArray();
//std::auto_ptr copy semantics
AutoArray(AutoArray&); //Note it can't be const because the "other" reference
//is null'd on copy...
AutoArray& operator=(AutoArray);
~AutoArray();
//Nothrow swap
// Note: At the moment this method is not thread safe.
void Swap(AutoArray&);
};
)
В любом случае, пытаюсь реализовать конструктор копирования . Есть фрагмент клиентского кода (еще не зафиксированный в битбакете, потому что он не собирается), который выглядит следующим образом:
AutoArray NtQuerySystemInformation(...) { ... };
AutoArray systemInfoBuffer = NtQuerySystemInformation(...);
Это не удается, потому что конструктор копирования принимает в качестве аргумента ссылку, отличную от const
.. .. но я не понимаю, как можно изменить конструктор копирования, чтобы он использовал ссылку const
, учитывая, что исходный AutoArray
, используемый в назначении, изменен (и, следовательно, не будет быть const
). Вы, конечно, не можете изменять вещи, чтобы использовать передачу по значению, потому что это конструктор копирования, и это будет бесконечный цикл!
Если бы я использовал auto_ptr
, это было бы правильно:
std::auto_ptr NtQuerySystemInformation(...) { ... };
std::auto_ptr systemInfoBuffer = NtQuerySystemInformation(...);
Как тогда может быть возможен класс с семантикой копирования auto_ptr
?