C ++ Тип возвращаемого константы суффиксного оператора приращения - PullRequest
0 голосов
/ 26 октября 2011

В C ++, где бы я ни видел в сети пример объявления оператора приращения суффикса, он всегда объявляется как

T& operator++(int);

, и я считаю, что это правильный синтаксис приращения суффикса, не так ли??

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

Пожалуйста, см. Пример кода:

class AClass
{
    int foo;

public:
    AClass(void) : foo(0) {};

    // Suffix increment operator
    // Consider adding const to return type
    /* const */ AClass operator++(int)
    {
        AClass cp(*this);
        foo++;
        return cp;
    };

    // Prefix increment operator
    AClass& operator++()
    {
        foo++;
        return *this;
    };
};

int main(int argc, const char* args[])
{
    /* This code would fail to compile.
    int bar = 5;
    (bar++)++;
     */

    // Similarily, I would expect this to fail
    //   but it will succeed unless I use const return type.
    AClass a;
    (a++)++;
}

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

  1. Есть ли какие-либо минусы для такой практики?Действительно ли это хорошая практика?
  2. Что такое действительно правильное объявление суффиксного оператора (я имею в виду стандарты)?
  3. Если это не то, как стандарт определяет, но это уже хорошая практика, не стоитне стало ли это стандартом?

Большое спасибо за ваши ответы!

Ответы [ 2 ]

6 голосов
/ 26 октября 2011

Приращение суффикса возвращает временную, а не ссылку (это означает, что ваша первая подпись неверна):

T& operator++() // prefix
{
    this->increment();
    return *this;
}

T operator++(int) // suffix
{
    // Almost always, you'll have this code:
    T tmp(*this); ++(*this); return tmp;
}

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

(a++).modify_me();

, который не изменяет a (он применяется modify_me к временному объекту).Сравните с

(++a).modify_me();

, который увеличивает a, а затем изменяет его.

Лично я не думаю, что это необходимо (поскольку вас могут заинтересовать побочные эффекты modify_me).Более того, в C ++ 11 вы можете привязать указанный временный объект к (неконстантной) ссылке на значение.Const, определяющий возвращаемый тип суффиксных операторов, отключает эту возможность.

1 голос
/ 26 октября 2011

и я считаю, что это правильный синтаксис приращения суффикса, не так ли?

Если под "правильным" вы подразумеваете "обычную практику", то нет.Если вы пытаетесь создать поведение, аналогичное оператору постфикса для целых чисел, оно должно возвращаться по значению.

const T operator++(int);

Это потому, что он создает копию, затем увеличивает ее, а затем возвращает копию.Поскольку копия является локальной, вам определенно не нужно возвращать ее по ссылке.

Значение const, которое вы можете взять или оставить, но важен возврат по значению, а не по ссылке.

...