为什么“operator>”需要 const 而“operator<”则不需要?

2024-04-16

考虑这段代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator < (const MyStruct& other) {
        return (key < other.key);
    }
};

int main() {
    std::vector < MyStruct > vec;

    vec.push_back(MyStruct(2, "is"));
    vec.push_back(MyStruct(1, "this"));
    vec.push_back(MyStruct(4, "test"));
    vec.push_back(MyStruct(3, "a"));

    std::sort(vec.begin(), vec.end());

    for (const MyStruct& a : vec) {
        cout << a.key << ": " << a.stringValue << endl;
    }
}

它编译得很好并给出了人们期望的输出。但是如果我尝试按降序对结构进行排序:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct MyStruct
{
    int key;
    std::string stringValue;

    MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}

    bool operator > (const MyStruct& other) {
        return (key > other.key);
    }
};


int main() {
    std::vector < MyStruct > vec;

    vec.push_back(MyStruct(2, "is"));
    vec.push_back(MyStruct(1, "this"));
    vec.push_back(MyStruct(4, "test"));
    vec.push_back(MyStruct(3, "a"));

    std::sort(vec.begin(), vec.end(), greater<MyStruct>());

    for (const MyStruct& a : vec) {
        cout << a.key << ": " << a.stringValue << endl;
    }
}

这给了我一个错误。这是完整的消息 https://bitbucket.org/snippets/Rockstar5645/Le4A48:

/usr/include/c++/7.2.0/bits/stl_function.h:在 'constexpr bool std::greater<_tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = MyStruct]' 的实例化中:
/usr/include/c++/7.2.0/bits/stl_function.h:376:20:错误:与“operator>”不匹配(操作数类型为“const MyStruct”和“const MyStruct”)
{ 返回 __x > __y; }

似乎是因为这里的这个函数没有const预选赛:

bool operator > (const MyStruct& other) {
        return (key > other.key);
}

如果我加上的话

bool operator > (const MyStruct& other) const {
        return (key > other.key);
}

然后一切就又好了。为什么会这样呢?我对运算符重载不太熟悉,所以我只是将其放入内存中,我们需要添加const但它为什么有效仍然很奇怪operator<没有const.


你会得到不同的行为,因为你实际上调用了两个不同的(重载的)sort http://en.cppreference.com/w/cpp/algorithm/sort功能。

在第一种情况下,您调用两个参数std::sort,它使用operator<直接地。由于向量元素的迭代器会产生非常量引用,因此它可以应用operator<正好。

在第二种情况下,您使用的是三参数版本std::sort。接受函子的那个。你过关了std::greater。这个函子有一个operator()声明如下:

constexpr bool operator()( const T& lhs, const T& rhs ) const;

请注意 const 引用。它绑定需要与 const 引用进行比较的元素。所以你自己的operator>也必须是 const 正确的。

如果你打电话std::sort with std::less http://en.cppreference.com/w/cpp/utility/functional/less, your operator<会产生相同的错误,因为它不是常量正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“operator>”需要 const 而“operator<”则不需要? 的相关文章

  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 将 try_emplace 与 shared_ptr 一起使用

    所以我有一个std unordered map
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 为什么 MISRA:2012 需要函数原型?

    我想知道为什么 MISRA 2012 需要函数原型 在下面的示例中 这两个原型并不是真正必要的 include
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • Spring @Async 限制线程数

    我的问题与这个非常相似 Async 阻止一个线程继续执行 直到其他线程完成 https stackoverflow com questions 4324212 async prevent a thread to continue until
  • Discord 机器人添加对消息的反应discord.py(无自定义表情符号)

    我一直在尝试使用discord py创建一个机器人 在阅读后使用discord py添加对消息的反应this https stackoverflow com questions 48982061 how do you have a bot
  • xamarin.forms 中的导航如何工作?

    由于我在 android 中的应用程序中使用 xamarin forms 因此我必须从一个页面导航到另一个页面 我的问题是 从一个页面导航到另一页面是否会将其添加到导航堆栈中 例如 如果我的应用程序有导航 例如第1页 gt 第2页 gt 第
  • if (static_cast(x)) 与 if (x)

    我有一位同事经常在条件语句中对 bool 进行显式强制转换 如下所示 SomeType ptr some value if static cast
  • 如何在aspx页面中的javascript中读取web.config中的值

    我在 aspx 文件中有一段 javascript 代码 在我的脚本函数中 我尝试从 web config 读取 SiteRootURL 值 如下所示 var k alert k 这是行不通的 当我添加上面的代码时 我的 aspx 页面顶部
  • .NET 3.5 处置注册表项

    我有以下代码 RegistryKey installKey Registry LocalMachine OpenSubKey installKey 我正在我的代码上运行静态分析工具 它给了我一个缺陷 说我从方法中返回而没有处理安装密钥 我知
  • 如何在Scrapy中迭代div?

    这可能是一个非常微不足道的问题 但我是 Scrapy 的新手 我试图找到问题的解决方案 但我只是看不出这段代码有什么问题 我的目标是废弃给定网站上的所有歌剧节目 每个节目的数据都位于一个具有 row fluid row performanc
  • JSON 到带有关系的核心数据

    下列的Ray Wenderlich 的新教程 http www raywenderlich com 15916 how to synchronize core data with a web service part 1我能够获取 JSON
  • Scrapy中如何控制yield的顺序

    帮助 阅读下面的scrapy代码和爬虫的结果 我想从中抓取一些数据http china fathom info data data json http china fathom info data data json 并且仅Scrapy被允
  • 在 PHP 中将静态方法作为参数传递

    在 PHP 中是否可以做这样的事情 myFunction MyClass staticMethod 这样 myFunction 将拥有对静态方法的引用并能够调用它 当我尝试它时 我收到 未定义的类常量 PHP 5 3 的错误 所以我想这不是
  • 关闭某个 url 上的 SFSafariViewController

    当我到达某个页面时 我试图关闭 SFSafariViewController 但在明确按下 完成 按钮之前我无法执行此操作 由用户 我想要的是在到达某个页面时立即获取 URL 然后关闭视图控制器 然后我可以用这个选择剩下的 func saf
  • 无法从 jar 文件中找到 Premain-Class 清单属性

    我从单个 class 创建了一个 jar 并且在清单中提到了 Premain class 该 jar 是按预期生成的 但是当我尝试运行使用该 jar 中的类的程序时 出现错误 清单 MD Premain Class Agent 代理程序 j
  • 变得坚固:: #connect 上的网络错误

    我尝试实现 fetch 并引发了此异常 Rugged NetworkError 此传输未实现 对不起 我能够检索远程实例 remote Rugged Remote lookup repo remote name remote connect
  • 如何学习 R 作为编程语言 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道如何将 R 语言作为 编程 语言来学习 而不是作为统计系统来学习 我的问题是由于缺乏对解析 评估等函数的理解而提出的 这些函数可能不会被
  • 权限被拒绝(公钥)。无法从远程存储库读取。

    我很抱歉 但我不知所措 我尝试按照其他说明进行操作 但无济于事 希望我的帖子足够清晰 以便我能够得到如何解决的简洁步骤 我在文件夹 x 中有一个文件 test1 php 我在 x test1 php 中打开了一个 Git Bash 对话框
  • 清除编辑文本 - adb

    如何使用 shell 命令清除焦点编辑文本 I tried adb shell input keyevent KEYCODE CLEAR Not worked adb shell input keyevent KEYCODE DEL Del
  • PostgreSQL 错误“无法连接到服务器:没有这样的文件或目录”

    像其他一些人一样 当我在项目中运行 rake db migrate 或什至尝试为我的大多数数据库任务时 我会收到此错误红宝石 on Rails http en wikipedia org wiki Ruby on Rails3 2 应用 P
  • 在摩卡中运行超级测试时如何获取实际的服务器错误?

    我有使用 supertest 和 mocha 的代码 import request from supertest var newGame describe Creating game function beforeEach function
  • 集成 Android Firebase 应用程序的推送通知

    我们正在构建一个实时聊天应用程序 供企业与消费者联系 目前我们正在使用 Firebase https www firebase com https www firebase com 作为原型的后端 它似乎工作正常 然而 我们在推送通知方面遇
  • 为什么“operator>”需要 const 而“operator<”则不需要?

    考虑这段代码 include