2015-05-06 13 views
8

Zainspirowany tym comment lambdy o wiązanie z parametrami odniesienia RValue bezpośrednio std::async wiązanie rvalue do lambda przez std::async kompiluje i wykonuje, jak oczekiwano (live example)Różnica std std :: asynchroniczny i :: wiążą podczas owijania RValue lambda odniesienia

auto lambda = [] (std::string&& message) { 
    std::cout << message << std::endl; 
}; 
auto future = std::async(lambda, std::string{"hello world"}); 
future.get(); 

Korzystanie std::bind jednak powoduje błąd kompilatora: (live example)

auto lambda = [] (std::string&& message) { 
    std::cout << message << std::endl; 
}; 
auto bound = std::bind(lambda, std::string{"hello world"}); // Compiler error 
bound(); 

to dlatego, std::bind zachowuje message jako lwartość, więc gdy przejdzie do lambda, argument nie będzie już odpowiadał parametrowi.

mam read że std::async wewnętrznie używa std::bind, tak jak to się uciec z parametrami odniesienia rvalue gdy std::bind nie? Czy istnieje szczególna część normy, która wymaga tego zachowania, czy jest to zależne od kompilatora?

Odpowiedz

4

I've read that std::async internally uses std::bind , so how does it get away with rvalue reference parameters when std::bind does not?

Wewnętrznie nie używa bind. (A raczej nie może bez przechodzenia przez epickie wygięcia, takie jak w @Praetorian's answer in that question, i o wiele łatwiej jest po prostu napisać coś osobno).

Zwykle jest realizowany przy użyciu nieco bind -Jak maszyn, ale jest to znacznie prostsze, ponieważ nie muszą obsługiwać wszystkie rodzaje dziwnych rzeczy bind uchwyty (zagnieżdżone bind s, symbole zastępcze, zrzucając dodatkowych argumentów, itd.)

Is there a particular part of the standard that requires this behavior or is this dependent on the compiler?

Jest to wymagane przez standard. Specyfikacja bind jest absurdalnie gęsta, ale wymaga podania zwykłych argumentów jako lwartości ([func.indbind.bind]/p10, bullet 4).

async jest określona w celu wywołania INVOKE (DECAY_COPY (std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...), a DECAY_COPY zawsze zwraca wartość r.

Powiązane problemy