Почему в C++ нет неявного побитового сравнения?
#include <iostream>
using namespace std;
struct S {
int m_i;
};
int main() {
S s1;
// okay - implicit copy constructor
S s2(s1);
S s3;
// okay - implicit copy assignment
s3 = s1;
// awkward
if(s1 == s2)
cout << "can't be" << endl;
return 0;
}
Эта часть не компилируется, как ожидалось, и, учитывая возраст этого проектного решения и количество кода, который (возможно) зависит от него, мы застряли с ним навсегда. Тем не менее, есть ли у кого-то догадка о первоначальных причинах этого?
2 ответа
Это из-за байтов заполнения, которые не инициализируются и поэтому могут иметь любое значение.
Например, если S
определяется следующим образом:
struct S {
char m_c;
int m_i;
};
между m_c
а также m_i
есть байты заполнения, которые могли бы сделать s1
а также s2
сравнивать неравно, даже если все члены имеют одинаковое значение.
Другая причина заключается в том, что некоторые типы могут иметь несколько представлений объекта для одного и того же значения.
Если S, скажем, содержит указатели, то два экземпляра S могут иметь одинаковое содержимое, но их указатели могут указывать на разную память (даже если данные в этих местах памяти идентичны).
Так что ваша схема не будет работать в полной общности.