`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 右值引用 的相关文章

随机推荐