Tôi có một mẫu chức năng, nơi tôi muốn thực hiện chuyển tiếp hoàn hảo vào một lambda mà tôi chạy trên một chuỗi khác. Dưới đây là một trường hợp thử nghiệm tối thiểu mà bạn có thể trực tiếp biên soạn:Hoàn hảo Chuyển tiếp đến async lambda
#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;
}
Đối với trường hợp không biên soạn, đây là dòng cuối cùng của thông báo lỗi đó là dễ hiểu:
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> >&’
Tôi có một cảm giác nó có thể có một cái gì đó để làm với cách T&&
được suy luận, nhưng tôi không thể xác định chính xác điểm thất bại và sửa chữa nó. Bất kỳ đề xuất?
Cảm ơn bạn!
EDIT: Tôi đang sử dụng gcc 4.7.0 chỉ trong trường hợp này có thể là một vấn đề biên dịch (có thể là không)
Tôi không chắc liệu mình có đúng hay không, nhưng có thể C++ yêu cầu bạn * rõ ràng * sử dụng 'std :: move' trên các đối tượng có cả bản sao và di chuyển ngữ nghĩa. –
Xin lỗi, tôi đã không cụm từ câu hỏi này. Hãy để tôi chỉnh sửa. Tóm lại, là tôi muốn cả hai hàm instantiations hoạt động, và chúng thực hiện một điều khác nhau (một chuyển tiếp vector bằng cách truyền tham chiếu xung quanh, chuyển tiếp khác bằng cách di chuyển tham chiếu rvalue mỗi lần). –
Chỉ ra rằng nó hoạt động nếu bạn đúc thành '(const std :: vector &)'. –