पर बिल्कुल सही अग्रेषण मेरे पास एक फ़ंक्शन टेम्पलेट है, जहां मैं एक लैम्बडा में पूर्ण अग्रेषण करना चाहता हूं जिसे मैं किसी अन्य थ्रेड पर चलाता हूं। यहाँ एक न्यूनतम परीक्षण का मामला है जो आप सीधे संकलन कर सकते हैं:एसिंक लैम्ब्डा
main.cpp|13 col 29| note: no known conversion for argument 1 from ‘std::vector<std::basic_string<char> >’ to ‘std::vector<std::basic_string<char> >&’
मुझे लगता है:
#include <thread>
#include <future>
#include <utility>
#include <iostream>
#include <vector>
/**
* Function template that does perfect forwarding to a lambda inside an
* async call (or at least tries to). I want both instantiations of the
* function to work (one for lvalue references T&, and rvalue reference T&&).
* However, I cannot get the code to compile when calling it with an lvalue.
* See main() below.
*/
template <typename T>
std::string accessValueAsync(T&& obj)
{
std::future<std::string> fut =
std::async(std::launch::async,
[](T&& vec) mutable
{
return vec[0];
},
std::forward<T>(obj));
return fut.get();
}
int main(int argc, char const *argv[])
{
std::vector<std::string> lvalue{"Testing"};
// calling with what I assume is an lvalue reference does NOT compile
std::cout << accessValueAsync(lvalue) << std::endl;
// calling with rvalue reference compiles
std::cout << accessValueAsync(std::move(lvalue)) << std::endl;
// I want both to compile.
return 0;
}
गैर संकलन मामले के लिए, यहाँ त्रुटि संदेश जो सुगम है की अंतिम पंक्ति है यह T&&
के साथ कुछ करने के लिए कुछ हो सकता है, लेकिन मैं विफलता के सटीक बिंदु को इंगित नहीं कर सकता और इसे ठीक कर सकता हूं। कोई सुझाव?
धन्यवाद!
संपादित करें: मैं बस मामले में जीसीसी 4.7.0 का उपयोग कर रहा है कि यह एक संकलक समस्या हो सकती है (शायद नहीं)
मुझे यकीन नहीं है कि मैं सही हूं, लेकिन हो सकता है कि सी ++ के लिए आपको * प्रतिलिपि बनाने के लिए * स्पष्ट रूप से * std :: move' का उपयोग करें, जिसमें प्रतिलिपि और सेमेन्टिक्स दोनों स्थानांतरित हों। –
क्षमा करें, मैंने सवाल अच्छी तरह से वाक्यांश नहीं दिया। मुझे संपादित करने दो। इसका संक्षेप में, यह है कि मैं काम करने के लिए दोनों कार्य तत्कालता चाहता हूं, और वे प्रत्येक एक अलग चीज करते हैं (प्रत्येक के आसपास एक संदर्भ पारित करके वेक्टर आगे बढ़ते हैं, दूसरी तरफ रावल्यू संदर्भ को आगे बढ़ाकर)। –
यह पता चला है कि यह काम करता है यदि आप '(const std :: vector &) 'पर जाते हैं। –