为什么C ++中没有隐式按位比较?

时间:2016-11-12 09:56:43

标签: c++ comparison-operators

#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 个答案:

答案 0 :(得分:4)

如果S包含指针,那么S的两个实例可能具有相同的内容,但它们的指针可能指向不同的内存(即使这些内存位置的数据相同)。

所以你的计划不能完全普遍。

答案 1 :(得分:4)

这是因为填充字节没有初始化,因此可以有任何值。

例如,如果S定义如下:

struct S {
    char m_c;
    int m_i;
};

m_cm_i之间,有填充字节可以使s1s2比较不相等,即使所有成员都具有相同的值。

另一个原因是某些类型可能具有相同值的多个对象表示。