Jest to przemyślany wybór/kompromis.
Po pierwsze, nie jest konieczne, aby dowiedzieć się, czy funkcja ta przekazana do async
przyjmuje swoje argumenty przez odniesienie, czy też nie. (Jeśli nie jest to prosta funkcja, ale obiekt funkcji, może to być na przykład przeciążony operator wywołania funkcji). Tak więc async
nie może powiedzieć: "Hej, pozwól mi tylko sprawdzić, co chce funkcja docelowa, a ja postąpię właściwie rzecz."
Zatem pytanie projektowe brzmi, czy w miarę możliwości bierze pod uwagę wszystkie argumenty (np. Czy mają one wartość l), czy zawsze wykonuje kopie? Wykonanie kopii jest tutaj wyborem: kopia nie może się zwinąć, a kopia nie może przedstawiać warunków wyścigu (chyba, że jest naprawdę dziwna). Tak więc dokonano wyboru: wszystkie argumenty są domyślnie kopiowane.
Ale wtedy mechanizm jest zapisywany tak, że faktycznie nie przekazuje następnie argumentów do stałego parametru odniesienia o stałej wartości l. To kolejny wybór dla bezpieczeństwa: w przeciwnym razie funkcja, która może zmienić oryginalną lwartość modyfikuje kopię, prowadząc do błędów, które są bardzo trudne do wyśledzenia.
Ale co, jeśli naprawdę, naprawdę chcesz mieć stały parametr odniesienia o wartości l? Co, jeśli obiecasz uważać na zwisające referencje i warunki wyścigu? Właśnie do tego służy std :: ref. Jest to jednoznaczne wyrażenie zgody na niebezpieczną semantykę odniesienia. To twój sposób na powiedzenie: "Wiem, co tu robię".
Nie trzeba wpisywać 'std :: reference_wrapper'. Użyj 'std :: ref'. – chris
Używam 'std :: ref', ale dzięki za podpowiedź :) – lizarisk
Będziesz musiał wykopać kod źródłowy libstdC++, jeśli interesuje Cię przyczyna tego błędu: http: //gcc.gnu .org/onlinedocs/gcc-4.8.1/libstdC++/api/a01256_source.html Numery wierszy do obejrzenia znajdują się w błędach. Powodzenia. – jrok