Оператор предварительного приращения, который возвращает void
Следующее скомпилировано нормально в обоих gcc
а также clang
:
class A{
public:
void operator++(){
printf("A++\n");
// return *this;
}
};
Не "правильный" способ реализации этого вида оператора:
class A{
public:
A &operator++(){
printf("A++\n");
return *this;
}
};
Является void
версия взломать? Я никогда не видел такой синтаксис. Поиск Google возвращает только одну учебную статью IBM об этом.
Почему это не очень широко используемый способ реализации предварительных приращений против возврата собственной ссылки.
2 ответа
Почему это не очень широко используемый способ реализации предварительных приращений против возврата собственной ссылки.
Если вы спрашиваете, почему преинкремент не имеет этой подписи, вместо того, чтобы возвращать ссылку lvalue на объект, к которому он применяется, то это потому, что он предназначен для вычисления выражения, чтобы его можно было использовать так же, как и для встроенных типов:
int i = 42;
int j = ++i;
A a;
A b = ++a; // Error if RHS is void
(++a).doSomething(); // ditto
Кроме того, ожидаемая семантика префикса ++
(а также --
), что они возвращают ссылку lvalue на (измененный) объект. Делать что-то другое неизменно приведет к путанице.
Вы, конечно, можете написать это так, и она будет делать то, что вы хотите. Но для дизайна существует общий принцип, согласно которому перегруженные операторы должны работать аналогично тому, как будет работать int, чтобы избежать удивления пользователей.
Люди ожидают, что смогут написать
A a;
B b = ++a;
Потому что именно так обычно работает pre-increment, и он был бы удивлен ошибкой компилятора, которую это выдает с вашим классом. Нет технической причины, по которой вы не можете заставить его делать что-то другое, так же, как вы можете заставить оператор + делать вычитание для своего класса, если вы действительно этого хотите.