簡體   English   中英

返回帶有std :: forward的std :: make_pair

[英]Returning std::make_pair with std::forward

我正在嘗試創建一個函數,該函數將返回包含兩種數據類型的對,其中第一種類型始終相同,而第二種是模板類型。 那有可能嗎? (我也想知道我對std::forward用法的理解是否正確)。 為了更好地說明我的問題,我將向您展示我的代碼的簡化示例(無效)。

這是我嘗試過的:

template <class X>
std::pair<int, X> func(X&& second)
{
    int first = 1;
    return std::make_pair(std::move(first), std::forward<X>(second));
}

內部功能,創建變量first ,然后我要回對。 在這里,我first采取行動-避免復制-並且(在Scott Meyers的演講中,他將std::forward解釋為“有條件的舉動”)取決於參數second為l值,我想將second作為l值傳遞給(讓std::make_pair在創建對時復制second ),或者如果它是r值,我想傳遞“移動” r值。

不幸的是我的代碼不起作用。 我想我一定誤會了一些東西,但是我不知道是什么,請您解釋一下?

我懷疑您在聲明中要使用C ++ 14 std::decay_tstd::remove_reference_t

template <class X>
std::pair<int, std::decay_t<X>> func(X&& second) {
    int first = 1;
    return std::make_pair(std::move(first), std::forward<X>(second));
}

或C ++ 11,更詳細,但等效的版本:

template <class X>
std::pair<int, typename std::decay<X>::type> func(X&& second) {
    int first = 1;
    return std::make_pair(std::move(first), std::forward<X>(second));
}

這樣,無論您使用對X的左值引用還是右值引用作為func的實際參數,您的std::pair都將X作為類型。


請注意,您不能std::pair X的引用用作std::pair的類型。
讓我們考慮以下示例:

#include<utility>

template <class X>
std::pair<int, X> func(X&& second) {
    int first = 1;
    return std::make_pair(std::move(first), std::forward<X>(second));
}

int main() {
    int i = 42;
    func(i);
}

在這種情況下, X推導為int & 因此,返回類型為std::pair<int, int &> ,這是不允許的並且不會編譯。

以下將改為編譯:

template <class X>
std::pair<int, std::remove_reference_t<X>> func(X&& second) {
    int first = 1;
    return std::make_pair(std::move(first), std::forward<X>(second));
}

這是因為X仍被推導為int & ,但是現在將返回類型調整為std::pair<int, int>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM