私は、別のスレッドで実行するラムダへの完全な転送をしたい機能テンプレートがあります。ここでは、直接コンパイルすることができ、最小限のテストケースである:非同期ラムダへの完璧な転送
#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;
}
非コンパイルする場合については、ここで分かりやすいですエラーメッセージの最後の行は次のとおりです。
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&&
がどのように推測されるかとは関係があるかもしれませんが、正確な失敗箇所を特定して修正することはできません。助言がありますか?
ありがとうございました!
編集:私は、これはコンパイラの問題である可能性があり念のためのgcc 4.7.0を使用しています(おそらくない)
私は正しいかどうか分かりませんが、C++ではコピーと移動のセマンティクスを持つオブジェクトで明示的に 'std :: move'を使用する必要があります。 –
申し訳ありませんが、私は文句をよく言いませんでした。私を編集させてください。その短所は、私は両方の関数のインスタンス化を働かせたいと思っており、それぞれは別のことをしているということです(参照を渡してベクトルを転送し、他の前方はrvalue参照を毎回動かすことによってベクトルを転送します)。 –
'(const std :: vector&)'にキャストすると動作することが分かります。 –