Почему в 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 могут иметь одинаковое содержимое, но их указатели могут указывать на разную память (даже если данные в этих местах памяти идентичны).

Так что ваша схема не будет работать в полной общности.

Другие вопросы по тегам