Это как вы говорите.
Если вы не используете std::ref
/ std::cref
или std::placeholder
, ваш аргумент копируется.
Затем передается «сохраненный» аргумент посредством ссылки на функцию во время вызова, но это не повлияет на объект, который вы передали на месте вызова.
Это может быть удивительно; вам просто нужно к этому привыкнуть.
Вы можете извлечь его из стандартной формулировки ( в [func.bind.bind]
), но, честно говоря, весь этот раздел довольно эзотеричен c.
То же самое относится и к std::thread
- вы должны использовать std::ref
, если вы хотите нести ссылки на всем протяжении.
Обе std::thread
и std::bind
обычно выполняют функцию, на которую ссылаются «позже», то есть вне текущей области (ваш пример для std::bind
необычен; обычно вы просто вызываете f
прямо там), поэтому безопаснее сделать это, поэтому вам нужно явно скажите «возьмите ссылку на эту вещь, если хотите этого. Это может или не может быть обоснованием дизайнеров.