相关疑难解决方法(0)

运算符重载的基本规则和习惯用法是什么?

注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案的索引,它们是最有意义的顺序:

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ operator-overloading operators c++-faq

2074
推荐指数
8
解决办法
88万
查看次数

为什么C++编译器没有定义operator ==和operator!=?

我非常喜欢让编译器为你做尽可能多的工作.在编写一个简单的类时,编译器可以为"free"提供以下内容:

  • 默认(空)构造函数
  • 复制构造函数
  • 析构函数
  • 赋值运算符(operator=)

但它似乎无法给你任何比较运算符 - 如operator==或operator!=.例如:

class foo
{
public:
    std::string str_;
    int n_;
};

foo f1;        // Works
foo f2(f1);    // Works
foo f3;
f3 = f2;       // Works

if (f3 == f2)  // Fails
{ }

if (f3 != f2)  // Fails
{ }
Run Code Online (Sandbox Code Playgroud)

有这么好的理由吗?为什么执行逐个成员比较会成为问题?显然,如果类分配内存然后你要小心,但对于一个简单的类肯定编译器可以为你做这个?

c++ operators

286
推荐指数
11
解决办法
8万
查看次数

什么是C++中的<=>运算符?

当我试图了解C++运算符时,我偶然发现cppreference.com上的一个奇怪的比较运算符,*在一个如下所示的表中:

在此输入图像描述

"好吧,如果这些是C++中常见的操作符,我会更好地学习它们",我想.但我所有试图阐明这个谜团的尝试都没有成功.即使在这里,在Stack Overflow上我的搜索也没有运气.

<=>和C++之间是否存在联系?

如果有的话,这个运营商到底做了什么?

*与此同时,cppreference.com更新了该页面,现在包含有关<=>运营商的信息.

c++ operators c++-faq spaceship-operator c++20

200
推荐指数
5
解决办法
3万
查看次数

三向比较运算符总是有效吗?

Herb Sutter在他的"宇宙飞船"运营商提案(第12.2节,第12页底部)中说:

基于所有内容<=>及其返回类型:此模型具有主要优势,与先前的C++提议和其他语言的功能相比,此提案有一些独特之处:

[...]

(6)效率,包括最终实现用于比较的零开销抽象:绝大多数比较总是单通道.唯一的例外是生成,<=并且>=在支持部分排序​​和相等的类型的情况下.对于<单通是基本实现了零开销的原则,以避免重复平等的比较,如struct Employee { string name; /*more members*/ };在使用的struct Outer { Employeee; /*more members*/ };-今天的对比违反零开销抽象,因为operator<在Outer执行冗余相等比较,因为它执行if (e != that.e) return e < that.e;横贯平等前缀 e.name两次(如果名称相同,则遍历Employee两次其他成员的相等前缀),这通常无法优化.正如Kamiński所指出的,零开销抽象是C++的支柱,并且首次实现它的比较是这种设计的一个重要优势<=>.

但他给出了这个例子(第1.4.5节,第6页):

class PersonInFamilyTree { // ...
public:
  std::partial_ordering operator<=>(const PersonInFamilyTree& that) const {
    if (this->is_the_same_person_as ( that)) return partial_ordering::equivalent;
    if (this->is_transitive_child_of( that)) return partial_ordering::less;
    if (that. …
Run Code Online (Sandbox Code Playgroud)

c++ operators spaceship-operator c++20

20
推荐指数
3
解决办法
2064
查看次数

宇宙飞船操作员的真实世界使用示例

spaceship operator 的定义旨在对排序进行强定义,但这是否会影响您的客户端代码的编写方式,或者只是如何定义您的类比较运算符?

由于在其他帖子中缺少真实世界的例子,我没有完全理解这部分。

关于宇宙飞船运营商的其他 SO 帖子:

c++ spaceship-operator c++20

6
推荐指数
2
解决办法
1825
查看次数