显式复制构造函数和 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 的相关文章

  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 当用户与 DateTimePicker 控件交互时会引发什么事件?

    我是 C 新手 在我的程序中使用 DateTimePicker Value Changed 事件 但我发现当用户单击箭头时发生 ValueChanged 事件 或者如果也以编程方式更改值 我只想识别 DateTimePicker 的用户交互
  • 如何从 OnChange 事件捕获文本框的值

    在我的 C MVC 应用程序中 我有一系列这样生成的文本框 foreach object item in items Html TextBox 渲染的结果是一系列看起来像这样的文本框
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • 将整数四舍五入到最接近的 10 倍数[重复]

    这个问题在这里已经有答案了 我想弄清楚如何对价格进行四舍五入 双向 例如 Round down 43 becomes 40 143 becomes 140 1433 becomes 1430 Round up 43 becomes 50 1
  • CRTP 能否完全取代小型设计的虚拟功能?

    Is CRTP http en wikipedia org wiki Curiously recurring template pattern有足够的能力智胜virtual功能齐全 我认为 CRTP 的唯一缺点是为每个重复模式生成大量代码
  • 将文件扩展名与应用程序关联

    我编写了一个编辑特定文件类型的程序 我想为用户提供在启动时将我的应用程序设置为该文件类型的默认编辑器的选项 因为我不需要安装程序 我尝试编写一个可重用的方法 通过向 HKEY CLASSES ROOT 添加一个键来为我关联一个文件 最好在任
  • EntityFramework:“参数值超出范围。”

    我在 EntityFramework 模型优先 中保存小数时遇到问题 在我的 EDMX 中 我声明我的属性为 Decimal 30 10 然后我尝试保存该数字 1215867935736100000 结果是 Parameter value
  • 如何获取字符串宽度

    我需要在类库中构建一个函数 该函数接受一个字符串和该字符串的特定字体 然后获取字符串的宽度 那么我怎样才能得到字符串边界宽度呢 另一种方法是使用TextRenderer 并致电its MeasureString http msdn micr
  • FileStream - “不支持给定路径的格式”

    我正在尝试使用EPPlus http epplus codeplex com 在我们的 LAN 上保存电子表格 我正在使用一个FileStream对象执行此操作 但是每当我尝试实例化该对象时 我都会收到错误 The given path s
  • 恢复多个监视器的窗口大小/位置

    许多帖子都涉及恢复 WinForm 位置和大小 例子 www stackoverflow com questions 92540 save and restore form position and size http www stacko
  • 将迭代器取消引用到临时范围时出现非指针操作数错误

    Using auto empty line auto str return str size 0 我们做得到 auto line range with first non empty ranges view drop while range
  • .NET 查询字符串值的正则表达式

    我需要从 Url PathAndQuery 中删除任何 id SomeValue 其中 SomeValue 可以是整数或字符串 它后面可能有也可能没有另一个 符号 所以它可能是 somepage aspx cat 22 id SomeId
  • 从网站保存嵌入的 pdf

    我正在编写一个小型 C 应用程序来管理供应商提供的 化学品 安全数据表 目前 我手动搜索该化学品并保存 pdf 并在我的程序中添加指向 pdf 的链接 问题是我还有很多化学品需要处理 所以最好将过程自动化 例如 化学品的部件号如下 2710
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 串行端口轮询和数据处理

    我正在尝试通过微控制器从传感器的多个串行端口读取数据 每个串口将接收超过2000个测量值 每个测量值7个字节 全部为十六进制 而且他们同时开火 现在我正在从 4 个串行端口进行轮询 另外 我将每个测量值转换为字符串并将其附加到字符串构建器
  • C# - 使用 Linq 获取 Attribute 的属性

    我有一个属性 它本身就有属性 我想访问这些属性之一 布尔值 并检查它是否正确 我能够检查属性是否已设置 但这就是全部 至少对于 linq 来说是这样 属性 public class ImportParameter System Attrib
  • 在 Qt C++ 中使用多个键

    我正在构建 坦克 游戏 我使用关键事件在地图上运行我的坦克 实际上我当时只能使用一把钥匙 但我需要有能力去完成任务 同时向上和离开 这是我的单键事件代码 switch event gt key case Qt Key Up if ui gt
  • 有没有 C# 到 C 的转换工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道 C 与 NET Framework 不同 C 是一种符合 ECMA ECMA 334 和 ISO
  • 如果 foreach 是一个结构数组,它会复制每个元素吗?

    我有一个结构数组 做foreach运算符在迭代数组时复制每个元素 据我所理解foreach只是底层的语法糖转换为for 所以看来答案是否定的 但我很想得到一些确认 PS 看来应该有人已经问过了 但我无法轻易找到任何东西 因此 请以提供的参考

随机推荐

  • 无法添加实体类型“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