2017-09-16 129 views
0

我试图找出一种方法来捕获一个可以由l和r值引用组成的可变数据包,并通过引用捕获l值来捕获r值,供以后使用(因此异步测试)。我尝试了以下操作:复杂的元组捕获

#include <iostream> 
#include <tuple> 
#include <future> 

template<typename... T> 
auto bar(T&&... values) 
{ 
    return [tup = std::forward_as_tuple(values...)](){ 
     std::cout << std::get<0>(tup) << std::endl; 
    }; 
} 

int lValue = 50; 

int main() 
{ 
    auto rvalues = bar(50); 
    auto lvalues = bar(lValue); 

    auto futureR(std::async(rvalues)); 
    auto futureL(std::async(lvalues)); 
    futureR.get(); 
    futureL.get(); 
    return 0; 
} 

但是,当执行rvalues lambda时会输出一个未定义的值。左值lambda输出所需的50而不需要复制构造(可能与大对象一起使用)。有没有一种方法可以通过值来捕获r值,而不需要复制构造通过l值引用传递的对象而不知道我将得到的l和r值的组合类型?

auto mixedValues = bar(50, lValue); 
auto futureMixed(std::async(mixedValues)); 

链接到例如外壳http://cpp.sh/336lv

回答

3

在:

template<typename... T> 
auto bar(T&&... values) 
{ 
    return [tup = std::forward_as_tuple(values...)](){ 
     std::cout << std::get<0>(tup) << std::endl; 
    }; 
} 

得益于参考压扁魔法,T为是左值参数左值引用类型,和非参考键入rvalues的参数。为此,您需要:

return [tup = std::tuple<T...>(std::forward<T>(values)...)](){ 
    std::cout << std::get<0>(tup) << std::endl; 
}; 

存储左值按值引用和右值。

+0

是的!这就是我所需要的,真棒,我害怕我需要一些大的丑陋元函数来将l值类型改回l值引用或其他东西,当你必须捕获到lambda时,这些东西会变得非常混乱.... –