【问题标题】:Why is there no implicit bitwise comparison in C++?为什么 C++ 中没有隐式按位比较?
【发布时间】:2016-11-12 09:56:42
【问题描述】:
#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;
}

这篇文章没有按预期编译,并且考虑到这个设计决策的年代和(可能)依赖于它的代码量,我们永远坚持下去。不过,是否有人对其背后的最初原因有预感?

【问题讨论】:

  • 因为比较是基于值的运算,而不是位运算。
  • 有建议将 memberwise 与 C++ 进行比较,例如 this one。可能成为未来标准的一部分。

标签: c++ comparison-operators


【解决方案1】:

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

例如,如果S定义如下:

struct S {
    char m_c;
    int m_i;
};

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

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

【讨论】:

  • 没有更多的合理性:编译器通常会使用 memcpy 实现默认的复制构造函数:尽管赞成。
  • memcpy复制没有问题,填充字节可以复制,因为它们无关紧要。
  • 这只是解释了为什么 memcmp 不是默认比较的正确方法,但在 C++ 中 memcpy 也不是默认副本的正确方法:编译器必须确保一个成员-成员副本(在这种情况下,对于 POD memcpy 是可以的)。所以这个问题应该被解读为:为什么没有默认的逐个成员比较?答案可能是:因为除了 memcpy 之外,memcmp 还不能满足 POD 的要求(而且人们懒得实现有用的语言功能)......
【解决方案2】:

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

所以你的方案不能完全通用。

【讨论】:

  • 这是Java 大放异彩的一个例子!
  • 这不是原因 - 比较指针是另一回事。
  • 比较指针不一样,但与比较指针指向的内存一样有效
猜你喜欢
  • 2019-03-01
  • 1970-01-01
  • 2016-10-22
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多