【问题标题】:How to forward lvalue reference?如何转发左值引用?
【发布时间】:2016-04-26 03:16:50
【问题描述】:

我有这个代码:

struct MultiMemoizator {
    template <typename ReturnType, typename... Args>
    ReturnType callFunction(std::function<ReturnType(Args...)> memFunc, const Args&... args) {
         return memFunc(args ...);
    }
};

int main()
{
    typedef vector<double> vecD;
    //filling vecD with random numbers...
    MultiMemoizator mem;
    function<vecD(vecD)> sort_vec = [](vecD &vec) {
        sort(vec.begin(),vec.end());
        return vec;
    };
    mem.callFunction<vecD,vecD>(sort_vec,vec);
    //vec is still not sorted!
}

由于memFunc(args ...); 发生的情况是args 的副本被排序而不是vec,所以最后vec 将在callFunction(...) 之后未排序。

我认为为了解决这个问题forward 可以帮助我,但如果我尝试:return cachedFunc(forward&lt;Args&gt;(args) ...); 就会发生一些不好的事情(比如vector::size=0)。

如何将args 引用转发到sort_vec?

【问题讨论】:

  • 我认为如果你有const Args&amp;&amp;... args,你只需要转发。

标签: c++11 pass-by-reference perfect-forwarding forwarding-reference


【解决方案1】:

将返回类型指定为Type&amp; 或const Type&amp;,并返回不是临时值的内容。 像这样:

function<vecD&(vecD&)> sort_vec = [](vecD &vec) -> vecD& {
    std::sort(vec.begin(),vec.end());
    return vec;
};

附言您正在尝试对 const 向量进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多