Прежде всего, существует третий вариант вашего кода:
bind(&A::foo, std::ref(a))();
Теперь, почему параметры по умолчанию копируются?Я предполагаю, но это просто дикое предположение, что считается предпочтительным, чтобы поведение bind
по умолчанию не зависело от времени жизни параметров: результатом привязки является функтор, вызов которого может быть отложен на долгое время после уничтожения параметров.
Вы ожидаете, что следующий код даст UB по умолчанию ?
void foo(int i) { /* ... */ }
int main()
{
std::function<void ()> f;
{
int i = 0;
f = std::bind(foo, i);
}
f(); // Boom ?
}