Ответ 1
Это может быть антиклиматическое обоснованное предположение. Я буду приветствовать любой другой конкретный пример, однако, следуя общим правилам, представляется очень разумным.
-
Такое ограничение не нарушит какой-либо конкретный код, но ограничит область принятых программ. c++ довольно консервативен, когда дело доходит до таких изменений, иногда к большой боли. Заметным примером будет наиболее неприятный анализ, какой код сломается, если
A a();
был интерпретирован как построенный по умолчаниюA
? Тем не менее, это не так, чтобы быть обратно совместимым с синтаксисом c. Это довольно PIA для синтаксического анализа. -
c++ позволяет семантическому переопределению значения оператора для пользовательских типов. Я не знаю, есть ли хороший пример семантического переопределения для
operator=
но есть некоторые довольно примечательные примеры для других операторов. boost :: program_options "злоупотребляет"operator()
довольно странным образом, чтобы создать сжатый синтаксис, а Eigen переопределяет семантику с запятой. Операторы-указатели-члены часто переопределяются, чтобы делать что-то нестандартное, поскольку они часто не используются по умолчанию. Поэтому иногда это полезно. -
Я думаю, это может быть полезно с классами, где
operator=
имеет побочные эффекты и не обязательно означает изменение значения в памяти. Я полагаю, что в некоторых встроенных разработках вы можете иметьRow
иCol
и вы пишетеrow * col = LED_ON
или что-то в этом роде. Еще один пример из верхней части моей головы - библиотека выражений, например,operator<=>
еще не существует, поэтомуoperator=
можно использовать для оценки таких вещей, как(p ^ p) <=> p
.
operator=
является особенным среди операторов, и они не намного более особенны, чем другие функции-члены. Если вы напишете такой код:
#include <iostream>
using namespace std;
struct A{
friend ostream& operator<<(ostream& out, A& a) { out << "A "; return out;}
};
int main() {
A a1, a2;
cout << a1=a2 << '\n';
return 0;
}
Это... сломается. Это потому, что побитовый сдвиг имеет приоритет над =
. Он требует скобок вокруг a1=a2
. Это означает, что operator=
действительно не имеет особых прав на языке.
Другое дело, что вы можете перегружать этих операторов почти так, как вы пожелаете, поэтому писать
#include <iostream>
using namespace std;
struct A{
bool operator=(A& rhs) {return true;}
};
int main() {
A a1, a2;
cout << (a1=a2) << '\n';
return 0;
}
Совершенно законно. Язык предоставляет оператору синтаксические ярлыки и не намного больше. Я не думаю, что многие жалуются, что (a+b).method()
работает, это то же самое для (a+b).operator=()
.
Бонус: пример с int
не работает, потому что вы не можете перегружать операторы для примитивных типов, а значение по умолчанию определено так, что оно не принимает значения rvalues. Он демонстрирует поведение, которое вы, похоже, ожидаете. В основном мы лишены свободы переопределения семантики примитивных операторов.