Последствия const_cast в конструкторе копирования? - PullRequest
0 голосов
/ 04 июля 2010

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

Я могу сделать это с помощью неконстантного конструктора копирования, а-ля:

class Test {
  public:
    Test(Test& other);
};

Но я хочу иметь возможность назначать напрямую из временного значения, возвращаемого вызовом функции:

Test test = make_test();

Конструктор копирования должен быть постоянным. Поэтому мне любопытно, каковы будут последствия использования const_cast в конструкторе копирования. Я бросил бы другую ссылку на неконстантный указатель и очистил указатель писателя, который я упомянул. Я знаю, что const_cast вообще считается злом, но может ли он работать в этом случае? Мне особенно любопытно, как он будет взаимодействовать с временными объектами, возвращаемыми при вызове функции.

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

Ответы [ 3 ]

3 голосов
/ 04 июля 2010

Звучит как работа для изменчивых:

struct A {

    A() : x(0) {}

    A( const A & a ) : x( a.x ) {
       a.x = 0;
    }

    mutable int x;
};

int main() {
    A a1;
    A a2 = a1;
}
2 голосов
/ 04 июля 2010

Вы нарушили бы публичный контракт вашего объекта и ожидания любого клиентского кода, сделав конструктор const-копии деструктивным.

Кроме этого, нет проблемы с удалением константности параметра.

1 голос
/ 04 июля 2010

Возможно, вы захотите взглянуть на реализацию std::auto_ptr, поскольку его конструктор копирования также изменяет исходный объект.

Но имейте в виду, что именно эта семантика именно поэтому многим не нравится std::auto_ptr.

...