То, что вам требуется явное std::ref()
(или boost::ref()
) в этих ситуациях, на самом деле является очень полезной функцией безопасности, так как передача ссылки может быть опасной по своей природе.
Снеконстантные ссылки довольно часто существует опасность, что вы передаете локальную переменную, при использовании const-ссылки она может быть временной, и когда вы создаете функцию, которая вызывается в другом потоке (и вообще с помощью bind)(часто это функция, вызываемая позже / асинхронно), вы рискуете, что объект больше не будет действительным.
привязка выглядит аккуратно, но эти ошибки труднее всего найти, например, где ошибкаперехватывается (т. е. при вызове функции) - это не то же самое место, где была сделана ошибка (во время привязки), и может быть очень трудно точно определить, какая функция вызывается в данный момент и, следовательно, где она былаbound.
Это безопасно в вашем случае, когда вы присоединяетесь к потоку в области действия переменной, которую вы передаетеСсылкаПоэтому, когда вы знаете, что в этом случае есть механизм для передачи ссылки.
Это не та особенность языка, которую я хотел бы видеть измененной, особенно потому, что, вероятно, много существующего кода полагаетсяпри этом создание копии, которая сломалась бы, если бы она просто взяла по ссылке автоматически (и тогда потребовался бы явный способ принудительного копирования).