Легко увидеть, что происходит. Просто замените int
на некопируемый тип (один с закрытым конструктором копирования), и компилятор укажет вам точное место, где libstdc++
пытается скопировать аргумент вместо использования ссылки. В моем случае это строка 138 в стандартном заголовке <tuple>
.
Является ли это правильной реализацией стандарта, в настоящий момент я не могу сказать.
ОБНОВЛЕНИЕ Стандарт гласит, что каждый аргумент std::thread::thread
должен удовлетворять требованию MoveConstructible
, и что фактические аргументы, передаваемые в функцию потока, создаются с помощью аргументов std::thread::thread
. Это означает, что
- функция потока получает копии аргументов, а
- оригиналы вполне могут быть уничтожены в процессе.
Так что передача материала по ссылке не будет работать.