为什么我需要包含<compare>标头才能编译 <=>?
Why do I need to include <compare> header to get <=> to compile?
我知道技术答案是:因为标准是这样说的。
但我对动机感到困惑:
我在默认<=>
中看不到任何"库":它可能会返回某种技术上在std
中定义的类型,但从某种意义上说,它是一个"假库"类型,编译器必须知道它,因为它必须能够默认operator <=>
返回类型auto
(更不用说好的编译器中的错误消息指定了<compare>
所以很明显有一种语言<=>库链接在这里(。
所以我知道有一些库功能可能需要我包含<compare>
但我不明白为什么默认<=>
需要我包含该标头,因为编译器无论如何都必须了解制作<=>
所需的一切。
注意:我知道大多数时候其他一些标准标题会包含<compare>
,这是一个关于语言/库设计的问题,而不是关于C++迫使我无缘无故地编写的额外行。
它可能会返回一些在 std 中技术定义的类型,但它在某种意义上是"假库"类型
好吧,<=>
返回非常真实的类型,这些类型实际上是在<compare>
中定义并在那里实现的。就像使用初始值设定项列表来构造一个std::initializer_list<T>
一样,它在很大程度上是一个实际在<initializer_list>
中定义的真实类型。typeinfo
在<typeinfo>
.
而这些比较类型——std::strong_ordering
、std::weak_ordering
和std::partial_ordering
(最初也是std::strong_equality
和std::weak_equality
(——本身就定义了重要的转换语义和其他操作,我们可能希望在未来进行更改。它们确实是非常特殊的语言类型,其中可转换性只朝着一个方向发展,但以一种与继承非常不同的方式(总排序类型只有三个值,但部分排序类型只有四个值......将它们定义为真正的库类型,然后将它们的交互指定为真正的库代码,这实际上要容易得多。
该编译器必须知道它,因为它必须能够默认
operator<=>
返回类型auto
有点,但不是真的。编译器知道类型的名称是什么,以及如何为基本类型生成它们的值,但它实际上不需要知道更多的东西。返回类型的规则基本上是根据底层成员<=>
返回的类型硬编码的,不需要知道这些实际类型是什么样子的。然后你只是调用了执行...无论什么。
必须包含标头的成本是键入#include <compare>
然后解析它。编译器必须合成这些类型的成本是必须为每个 TU 支付的成本,无论它是否执行任何三向比较。另外,如果/当我们想更改这些类型时,无论如何更改库类型比更改语言类型更容易。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中