Как идиоматически определить оператор присваивания для неизменяемых классов? - PullRequest
2 голосов
/ 19 июля 2011

В C ++, каков идиоматический способ определения operator= для класса, который должен быть неизменным.Например, все его переменные-члены const.

typedef unsigned char byte;

class Binary
{
protected:
    const unsigned long size;
    const byte* bytes;

public:
    Binary(const unsigned long size);
    Binary(const Binary &b);
    ~Binary(void);

    Binary& operator=(const Binary &b);
};

где bytes - указатель на блок памяти malloc ed во время выполнения.

Определить ли пустой оператор присваивания или разрешить ему использовать автоматически сгенерированныйкоторый, очевидно, потерпит неудачу?

Я пытаюсь реализовать и применить семантику одиночного присваивания в нескольких выбранных классах.

1 Ответ

9 голосов
/ 19 июля 2011

Предполагая, что вы не собираетесь переназначать своих участников (используя const_cast и т. Д.), Я бы предложил прямо указать в вашем коде, что вы не используете operator =.

В текущем стандарте C ++, сделайте его private и не реализованным:

class Binary
{
  //...
private:
  Binary& operator = (const Binary&);
};

В следующем стандарте C ++ 0x, delete it:

class Binary
{
  //...
  Binary& operator = (const Binary&) = delete;
};
...