我正在尝试创建一个函数,该函数将返回包含两种数据类型的对,其中第一种类型始终相同,但第二种是模板类型。这可能吗? (我也想知道我对 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
是左值 我想将 second
作为左值传递(让 std::make_pair
复制 second
,在创建对时)或者如果它是右值,我想传递“移动的”右值。
不幸的是我的代码不起作用。我想我一定是误解了什么,但我不知道是什么,请你解释一下好吗?
最佳答案
我怀疑你想要一个 C++14-ish 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
作为一种类型。
请注意,您不能使用对 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>
.
关于c++ - 返回 std::make_pair 与 std::forward,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41433191/