Rozważmy poniższy kod:std :: asynchronicznie zanikające (tracące) wartości rvalue w Visual Studio 2012 Update 2. Jakiekolwiek obejścia?
#include <memory>
#include <future>
using namespace std;
template <typename T, typename Work>
void Test2(future<T> f, Work w)
{
async([](future<T> && f, Work w)
{}, move(f), move(w));
}
int main()
{
future<int> x = std::async([]()->int{
std::this_thread::sleep_for(std::chrono::microseconds(200));
return 10;
});
Test2(std::move(x), [](int x){});
return 0;
}
Powyższe, nie powiedzie się z powodu następującego błędu kompilatora:
Error 1 error C2664: 'void Test2::::operator ()(std::future<_Ty> &&,Work) const' : cannot convert parameter 1 from 'std::future<_Ty>' to 'std::future<_Ty> &&' c:\program files (x86)\microsoft visual studio 11.0\vc\include\xrefwrap 98 1 ConsoleApplication6
GCC 4.7.2 kompiluje dobrze http://ideone.com/KhMiV6
Zanim pójdę do przodu i raport to na Microsoft Connect:
1) Czy to błąd ze strony VC11 lub jest to faktycznie standar d zachowanie?
2) Czy ktoś wie o obejście tego?
EDIT: I zgłaszali go na Microsoft Connect here. Aby przyspieszyć rozwiązanie, zachęcamy do jego upowszechnienia.
Zainspirowany przez std :: ref, myślałem o dokładnie tym samym rozwiązaniu. Jednym z problemów, które należy zanotować przy pomocy Twojego kodu, jest parametr 'f' Test2, który wykracza poza zakres i zostaje zniszczony, zanim osiągnie linię' future && f = fr.get(); '. Naprawiłem to w moim własnym kodzie (dość zabawne, że miałem dokładnie ten sam problem). Jestem zainteresowany tym, jak to naprawisz. Dziękuje za odpowiadanie. –
Och, tak, ale możesz też zapisać 'mutable T' (zamiast' T && ') w swojej klasie otoki i przekazać to podczas kopiowania. Tak więc opakowanie ma nawet własność twojej przyszłości. –
To było również moje rozwiązanie. Zmodyfikuj swoją odpowiedź tak, aby odzwierciedlała poprawne rozwiązanie, więc mogę ją zaakceptować :) –