2014-06-28 103 views
1

對於C++ 98C++ 11 rvalue引用

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; 
} 

問題>我發現,它是不方便通過make_pair創建具有非右值參考變量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

謝謝

+2

只要使用'make_pair(I,J)'沒有明確指定類型參數。如果你傳遞了左值引用,編譯器會推斷出類型參數爲'int&'。 – nosid

+0

請注意,'make_pair'的參數是* universal references *。 – dyp

+0

也傳遞一個左值(引用)將導致一個左值引用,而不是右值引用。它會被複制,而不是被移動。有關更多詳細信息,請參閱https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers – texasbruce

回答

3

std::make_pair的一點是要演繹出你的論點類型適合你。否則,你可以只寫:

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

相反,你寫

auto p = std::make_pair(42, -1.5); 
1

你問:

在實踐中,你如何與非右值引用變量使用make_pair的?

您可以使用:

auto p4 = make_pair(i2, j2); 
auto p5 = make_pair(i, j);