[英]Why is my forward to std::make_pair in a separate namespace ambiguous?
[英]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_t
或std::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.