显式复制构造函数和 std::sort

2024-01-10

当对具有显式复制构造函数的对象容器进行排序时,我收到我不理解的编译器错误(来自 g++ 4.8.2 和 clang++ 3.4,均处于 -std=c++11 模式)。我创建了一个简单的示例来演示该问题

class A {
public:
  explicit A(int i): m_i(i) {};
  explicit A(const A& other): m_i(other.m_i) {};
  int i() const {return m_i;};
private:
  int m_i;
};

bool is_less(const A& a, const A& b) {
  return a.i() < b.i();
}

int main(int, char*[]) {
  std::vector<A> objects;
  objects.push_back(A(3));
  objects.push_back(A(5));
  objects.push_back(A(-1));

  std::cout << is_less(objects[1], objects[2]);
  std::sort(objects.begin(), objects.end(), is_less);

  for (auto& a: objects) {
    std::cout << a.i() << " ";
  }
  std::cout << std::endl;
}

这失败了

error: 
  no matching constructor for initialization of '_ValueType' (aka 'A')

在 clang++ 中并与

error: no matching function for call to ‘A::A(std::remove_reference<A&>::type)

在 g++ 中。如果复制构造函数不显式,代码可以编译并正常工作(但我想强制只有对我的对象的引用才能用作参数和返回值)。删除对以下内容的调用后,该代码也会编译std::sort (so is_less(objects[1], objects[2])不是问题)。因此,我的问题是 std::sort 在调用导致编译此代码失败的比较函数时会做什么以及如何修复它。

经过大量研究后,唯一接近我的问题的问题是在复制初始化中,对复制构造函数的调用是显式的还是隐式的? https://stackoverflow.com/questions/21822438/in-copy-initialization-is-the-call-to-the-copy-constructor-explicit-or-implicit它链接到 gcc 中的一个错误。然而, clang 显示了相同的行为,所以我真的很想了解发生了什么。


std::sort要求元素类型为MoveConstructible.

要求MoveConstructible说明表达式T u = rv;必须有效。但是,此表达式执行复制初始化并要求存在非显式复制或移动构造函数。

在这种情况下,复制构造函数是显式的,声明它意味着不存在隐式声明的移动构造函数。因此,该表达式无效,并且该类A is not MoveConstructible.

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

显式复制构造函数和 std::sort 的相关文章

  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • StackExchange Redis 删除所有以以下开头的键

    我有一个格式的密钥 Error 1 Error 24 Error 32 Using StackExchange Redis 我该怎么办KeyDelete在与格式匹配的所有键上Error 在另一个答案中我看到了 LUA 脚本 EVAL ret
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 如何配置 Ninject 来注入 NodaTime IClock

    在我的 NinjectConfigurator 中我有 container Bind
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • 仅使用一个 #include 表达式一次包含多个头文件?

    是否有任何表达式可以使语法一次包含多个标头 而无需为每个新文件编写 include 表达式 例如 include
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 现代编译器的 C++ 中“memset”功能的状态

    Context 不久前 我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章 http www ddj com cpp 184403799 http www ddj com cpp 184403799 它是关于比较将
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 以编程方式阻止 Vista 桌面搜索 (WORDS) 对映射网络驱动器上的 pst 文件建立索引

    经过几天的多次尝试 我没有找到任何 100 的解决方案来解决这个问题 我的搜寻和调查范围 直接访问注册表 HKLM SOFTWARE Microsoft Windows Search CrawlScopeManager Windows Sy
  • TCP/IP 传输期间套接字数据损坏

    当我通过预连接的 TCP IP 套接字发送数据时 我发现数据已损坏 Example Station1 正在向 Station2 发送数据 我已经在发送之前 在 S1 和接收之后 在 S2 打印了数据 以下是消息 S1 发送的数据是ACKS2
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 无法添加实体类型“X”的种子实体,因为没有为所需属性“..ID”提供值

    我在玩机智EF Core 2 1 预览 2 我在使用 HasData Seed 方法时遇到问题OnModelCreating ModelBuilder modelBuilder 我的模型是简单的 POCO 类 没有注释 public cla
  • 无法使用“Regex::replace()”来替换编号的捕获组

    我正在将复数器移植到 Rust 但在使用正则表达式时遇到了一些困难 我无法获取Regex replace 正如我所期望的那样 替换编号捕获组的方法 例如 以下显示空字符串 let re Regex new m l ouse unwrap p
  • 从文件开头删除字节数

    我想复制一个没有前 256 个字节的文件 有没有一个好的方法可以用 python 来做到这一点 我猜想简单的方法是用计数器读取字节 然后仅在达到 256 时才开始复制 我希望有更优雅的方式 Thanks with open input rb
  • 如何在复杂数据的情况下分离行

    说实话这个问题本来就不是我的 这个问题 https stackoverflow com q 67871768 2884859促使我把它放在一个简化的案例中 因此 我必须根据分隔符将输入到单元格 列中 的数据分隔成单独的行 即 在目前的情况下
  • 我从脚本创建了文本区域扩展器,但之后它没有扩展

    不知道标题是否正确 我使用一个脚本创建了一张包含 5 个文本区域且 class expand 的表 当我写入时 该文本区域会扩展 但随后不起作用 写完之后有调用jquery插件的方法吗 在我尝试不创建文本区域之前 我在 html 文件中写入
  • Bash 脚本将文本文件与文件名中的特定子字符串连接起来

    在某个目录中 我有许多包含一堆文本文件的目录 我正在尝试编写一个脚本 仅将每个目录中文件名中包含字符串 R1 的文件连接到该特定目录中的一个文件中 以及将那些文件名中包含 R2 的文件连接到另一个 这是我写的 但它不起作用 bin bash
  • 如何使用设备ID获取USB硬件ID?

    如何使用设备ID获取USB设备的硬件ID 我使用的是vc 6 0 操作系统是xp 使用wmi可以吗 终于解决了我的问题 谢谢你的回复 我在这里发布代码 它可能对某人有用 通过这段代码 我们可以获取与我们系统连接的设备的所有硬件ID HDEV
  • 为什么在 WPF 中的菜单上操作时 TextBox 不会失去焦点?

    如果我编辑与 ViewModel 绑定的 TextBox 上的文本 然后单击主应用程序菜单 以保存数据 ViewModel 不会使用新数据进行更新 因为不知何故 TextBox 不会失去焦点 然后数据未更新 为什么文本框不会失去焦点 我应该
  • Python循环引用

    尝试在同一个文件中拥有两个相互引用的类 让它发挥作用的最佳方法是什么 class Foo object other Bar class Bar object other Foo if name main print all ok 问题似乎在
  • Android 空指针异常 不确定如何修复它

    我的代码中的一行不断收到空指针异常错误 但我不知道如何修复它 它基本上只是另一种方法的副本 所以我不知道为什么它会给我错误 任何帮助 将不胜感激 import java util Calendar import android app Ac
  • Java 上有关无效 XML 字符的错误

    在 Java 上解析 xml 文件时出现错误 An invalid XML character Unicode 0x0 was found in the element content of the document xml 来自 web
  • Kotlin:安全的 lambda(无内存泄漏)?

    读完后这篇关于内存泄漏的文章 https medium com freenet engineering memory leaks in android identify treat and avoid d0b1233acc8 yet4778
  • “如果不是 _____ 就什么都不是”以及它检查的内容

    VB 中的这条语句是检查对象是否存在 还是检查内容是否为空 我认为它正在检查内容是否为空 但我想仔细检查一下 提前致谢 VBA 中 null 的概念 即NullReferenceException null 如果您熟悉 C 或者NullPo
  • 流星当前活跃用户?

    我正在流星中制作一个简单的聊天室 我如何获取当前活跃用户的列表 有没有办法真正获取当前连接 客户端的列表 我昨天浏览了流星源 看看是否已经有类似的东西了 我找不到连接的标志或任何东西 我想你会有两种选择 在客户端和服务器中为每个连接的用户实
  • 以编程方式更新 MS Word 中 excel 对象的链接命名范围 (2007)

    第一个问题 请问这个问题是否已经解决 但我已经彻底搜索并找不到答案 我已将几个命名范围链接到一个 Word 文档中 此 Word 文档 以及带有命名范围的相关 Excel 工作簿 是一个模板 它供同事制作这些模板 Word 文档和 Exce
  • 在python中添加年份

    如果我想在程序中添加 100 年 为什么它显示错误的日期 import datetime stringDate January 10 1920 dateObject datetime datetime strptime stringDate
  • 正则表达式仅匹配前面有空格或没有任何内容的特定字符(行首)

    考虑以下推文 RT username This is my tweet Check this RT username This is my tweet I have PART 2 downloaded In a preg replace 调
  • 将 Postgresql 数组直接读入 Golang Slice

    我有一个查询返回一行 其中有一列包含字符串数组 character varying http wp me p62MJv Jc http tyrant click 1LGBoD6 有没有简单的方法可以将其直接读入 Golang 切片中 例如
  • 在我的项目中使用 jar 时出错

    我使用 Java 1 8 来创建我的 jar 我在Java项目中可以使用它 但是在Android项目中 出现以下错误 Error Error converting bytecode to dex Cause Dex cannot parse
  • 显式复制构造函数和 std::sort

    当对具有显式复制构造函数的对象容器进行排序时 我收到我不理解的编译器错误 来自 g 4 8 2 和 clang 3 4 均处于 std c 11 模式 我创建了一个简单的示例来演示该问题 class A public explicit A