2016-12-07 1 views
0

я узнал: Определенного пользователем оператор инкремента постфикса должен возвращать константный объект ведет себя как фундаментальный арифметический тип:Как реализовать Postfix приращение оператора

int i = 0; 
i++ = 42; // error, i++ is pr-value 
++i = 42; // ok, ++i is l-value 

так и для класса Widget он должен быть объявлен как

const Widget operator++(int); 
... 
Widget w1, w2; 
w1++ = w2; // error, fine, same as i++ = 42 

без const, он будет скомпилирован. Но с этим на месте, это не представляется возможным, вызвать

void f(Widget&&); 
f(w1++); // error, invalid initialization of Widget&& from expression const Widget 

что Питти, причиной w1 ++ является выражение г-значение, и это константность не имеет никакого влияния, потому что это временно, не так ли?

Теперь, как должен быть объявлен оператор ++ (int)? Спасибо за советы.

+1

Вот как должны быть объявлены эти операторы http://en.cppreference.com/w/cpp/language/operator_incdec – DeiDei

ответ

2

Определенного пользователь постфикс оператор инкремента должен возвращать константный объект ведет себя как фундаментальный арифметический тип:

Возвращение const -qualified типов классов не рекомендуется в C++ 11. Как вы заметили, это предотвращает использование операций перемещения. Чтобы вести себя как фундаментальный арифметический тип, более простой подход заключается в отключении оператора = на rvalues.

struct S { 
    S &operator=(const S &) & = default; 
    S &operator=(S &&) & = default; 
}; 
S f() { return {}; } 
int main() { 
    S s; 
    s = s; // okay 
    s = f(); // okay 
    f() = s; // error 
} 

При этом, вы можете объявить Widget operator++(int);, отклонить w1++ = w2;, но позволяют f(w1++);.

0

Widget operator++(int); - стандартное определение.

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

Лично я никогда этого не делаю, это просто лишнее ограничение и вызывает проблемы, подобные тому, что вы показываете в этом примере. Но другие люди считают, что стоит «цена» отказа от f(w1++), чтобы получить диагностику компилятора около w1++ = w2;, которая, вероятно, будет логической ошибкой. Это вопрос мнения и стиля кодирования.