Делайте конкретные типы регулярными
Причина
Регулярные типы проще понять и рассуждать о них, чем о нерегулярных (нерегулярности требуют дополнительных усилий для понимания и использования).
Встроенные типы C++ являются регулярными, как и классы стандартной библиотеки, например string, vector и map. Конкретные классы без присваивания и равенства могут быть определены, но они являются (и должны быть) редкостью.
Пример
struct Bundle {
string name;
vector<Record> vr;
};
bool operator==(const Bundle& a, const Bundle& b)
{
return a.name == b.name && a.vr == b.vr;
}
Bundle b1 { "my bundle", {r1, r2, r3}};
Bundle b2 = b1;
if (!(b1 == b2)) error("невозможно!");
b2.name = "the other bundle";
if (b1 == b2) error("Нет!");
В частности, если конкретный тип копируемый, желательно также определить для него оператор сравнения на равенство и обеспечить, чтобы a = b подразумевало a == b.
Примечание
Для структур, предназначенных для совместного использования с кодом на C, определение operator== может быть нецелесообразным.
Примечание
Дескрипторы для ресурсов, которые не могут быть клонированы, например scoped_lock для mutex, являются конкретными типами, но обычно не могут быть скопированы (вместо этого их, как правило, можно перемещать), поэтому они не могут быть регулярными; вместо этого они, как правило, являются типами только для перемещения.
Контроль
???