c++ - 返回 std::make_pair 与 std::forward

标签 c++ c++11

我正在尝试创建一个函数,该函数将返回包含两种数据类型的对,其中第一种类型始终相同,但第二种是模板类型。这可能吗? (我也想知道我对 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_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作为一种类型。


请注意,您不能使用对 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/

相关文章:

c++ 和 portaudio,可怕的扭曲输出

c++ - 有没有办法在 ">"条件下用 > 替换字符串 'if'?

c++ - 错误 PRJ0019 : A tool returned an error code from "moc' ing qt/gui/QFloatSlider. h

c++ - Widget&& rhs 是左值还是右值引用

c++11 - C++ - 可变参数模板部分特化

c# - 为什么从针对任何 CPU 的 C# 项目调用时,此代码会抛出 System.AccessViolationException?

c++ - 在 cuda/c++ 代码中使用模板类

c++ - 为什么不使用 #define 来隐藏 unique_ptr 丑陋在这里工作?

c++ - 公开 std::vector 接口(interface)的任何更好的方法?

c++ - 如何为多种 C++ 类型创建编译时检查?