`std::make_pair` 中的 c++11 右值引用

2023-12-23

对于 C++98

template <class T1, class T2>
  pair<T1,T2> make_pair (T1 x, T2 y);

对于 C++11

template <class T1, class T2>
  pair<V1,V2> make_pair (T1&& x, T2&& y);  // see below for definition of V1 and V2

如果 T1 和/或 T2 是右值引用,则对象将被移动并 x 和/或 y 处于未定义但有效的状态。

// make_pair example
#include <utility>      // std::pair
#include <iostream>     // std::cout
#include <functional>
#include <unordered_set>
using namespace std;

int main () {
  int i = 2;
  int j = 3;

  pair<int, int> p0 = make_pair<int, int>(2, 3); // fine
  pair<int, int> p1 = make_pair<int, int>(move(i), move(j)); // fine
  pair<int, int> p2 = make_pair<int, int>(i+0, j+0); // fine
  pair<int, int> p3 = pair<int, int>(i, j); // fine

  const int i2 = 2;
  const int j2 = 3;
  // error: no matching function for call to ‘make_pair(const int&, const int&)’
  pair<int, int> p4 = make_pair<int, int>(i2, j2); // wrong

  // error: no matching function for call to ‘make_pair(int&, int&)’
  pair<int, int> p5 = make_pair<int, int>(i, j); // wrong

  return 0;
}

Question> 我发现创建一个不方便pair与非右值引用变量make_pair。 正如您在上面的代码中看到的,以下行无法编译。

  // error: no matching function for call to ‘make_pair(int&, int&)’
  pair<int, int> p4 = make_pair<int, int>(i, j); // wrong

在实际应用中,如何利用make_pair使用非右值引用变量?

谢谢


要点是std::make_pair是为你推断出你的论点类型。否则你可以这样写:

auto p = std::pair<int, double>(42, -1.5);

相反,你写

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

`std::make_pair` 中的 c++11 右值引用 的相关文章

  • C 中的互斥锁/锁:C11 `mtx_lock()` 与 `pthread_mutex_lock()`

    互斥体直到 C11 才被引入 C 标准 对吗 既然它们已经存在 那么人们应该使用哪一个或更喜欢哪一个 以及何时使用 为什么 有什么区别 C11 s mtx lock vs pthread mutex lock C11 s mtx lock
  • 使用初始值设定项列表初始化包含 const 数组的结构

    我使用 C 11 并有一个包含以下结构的类 struct Settings const std string name const std string A const size t a class X static const Setti
  • C++11 使用 std::function 进行类型推导

    即使阅读了许多在线资源和其他问题 包括使用 lambda 从 std function 返回类型推导模板参数类型 https stackoverflow com questions 12405102 template argument ty
  • 我可以在堆栈展开期间使用 std::current_exception 吗?

    是否可以在堆栈展开期间销毁的对象的析构函数内使用 std current exception 有关 cppreference 的文档 http en cppreference com w cpp error current exceptio
  • 为什么转发引用与右值引用具有相同的语法?

    我刚刚对这些 相当 新的功能做了一些研究 我想知道为什么 C 委员会决定为它们引入相同的语法 看来开发人员不必要浪费一些时间来理解它是如何工作的 而一种解决方案可以让我们思考进一步的问题 就我而言 它是从问题开始的 可以简化为 includ
  • 使用智能指针在大型对象集合中创建多个索引

    我正在为一个大型对象集合创建多个索引 即使用不同的键 对象可以改变 集合可以缩小和增长 到目前为止我的想法 保留某种指向对象的指针的多个集合 使用set代替map以获得更好的封装 使用 unordered set 可以很好地扩展大型数据集
  • 整数的复制与 std::move

    在该示例中 默认复制和 std move 有什么区别 After move新旧对象之间是否存在依赖关系 int main int a 100 std cout lt lt a lt
  • C++11 随机数

    我需要生成随机数 但范围尽可能广泛 至少 64 位 我不在乎分布是否完美 所以std rand 会起作用 但它只返回一个int 据我所知 c 11 具有一些随机数生成功能 可以给出任何大小的数字 但使用起来非常复杂 有人可以发布一个简单的示
  • static_assert 有什么作用,你会用它做什么?

    你能举个例子吗static assert C 11 会优雅地解决手头的问题吗 我熟悉运行时assert 我应该选择什么时候static assert 超过常规assert 另外 在boost有一种东西叫做BOOST STATIC ASSER
  • 所有 CopyConstructible 类型都是 MoveConstructible 类型吗?

    根据工作草案 N3337 与已发布的 ISOC 11 标准最相似的草案 和cppreference com http en cppreference com w cpp concept CopyConstructible 答案是肯定的 N3
  • 从 unique_ptr 创建一个shared_ptr

    在我最近审查的一段代码中 它编译得很好g 4 6 我遇到了一个奇怪的尝试创建一个std shared ptr from std unique ptr std unique ptr
  • 混合别名和模板专业化

    我试图找到一种最好的方法来拥有一种可以专门化或 链接 到另一种类型的 对象 例如 您不能专门化一个类以使其成为一个简单的 int 并且您不能使用关键字 using 来专门化类 我的解决方案如下 template
  • 为什么需要取消引用迭代器?

    为什么需要取消引用迭代器 例如在下面的程序中 include
  • 变量模板和 std::cout -- 构造顺序

    看起来我们可以安全地使用std cout具有静态存储持续时间的对象构造函数中的对象 如此处所述question https stackoverflow com questions 8784892 is stdcout guaranteed
  • 指向 STL 容器的指针安全吗?

    如果我做一个怎么办unique ptr指向一个STL容器的实例 如下所示 这段代码安全吗 unique ptr lt vector
  • 如何使这些 std::function 参数明确?

    传递 lambda 时 以下函数重载是不明确的 我发现std function can be 由大多数可调用类型构造 https stackoverflow com a 22543082 1079110 即使他们的签名不匹配 所以编译器无法
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API

随机推荐