为什么 C++ 中没有隐式按位比较?
Why is there no implicit bitwise comparison in 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;
}
这篇文章没有按预期编译,考虑到这个设计决策的年代和(可能)依赖它的代码量,我们永远坚持下去。尽管如此,有没有人预感到其背后的最初原因?
例如,如果 S 包含指针,那么 S 的两个实例可能具有相同的内容,但它们的指针可能指向不同的内存(即使这些内存位置的数据相同)。
所以你的方案不能完全通用。
这是因为填充字节没有初始化,因此可以有任何值。
例如,如果S
定义如下:
struct S {
char m_c;
int m_i;
};
在 m_c
和 m_i
之间,有填充字节可以使 s1
和 s2
比较不相等,即使所有成员都具有相同的值。
另一个原因是某些类型可能具有相同值的多个对象表示。
#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;
}
这篇文章没有按预期编译,考虑到这个设计决策的年代和(可能)依赖它的代码量,我们永远坚持下去。尽管如此,有没有人预感到其背后的最初原因?
例如,如果 S 包含指针,那么 S 的两个实例可能具有相同的内容,但它们的指针可能指向不同的内存(即使这些内存位置的数据相同)。
所以你的方案不能完全通用。
这是因为填充字节没有初始化,因此可以有任何值。
例如,如果S
定义如下:
struct S {
char m_c;
int m_i;
};
在 m_c
和 m_i
之间,有填充字节可以使 s1
和 s2
比较不相等,即使所有成员都具有相同的值。
另一个原因是某些类型可能具有相同值的多个对象表示。