Q:

Передача параметра в функцию через функцию std::ref()

В примере с потоками встретил передачу параметра через функцию ref из стандартной библиотеки, не ясно как ее использовать, почему нельзя передать переменную просто по ее имени?
Вот собственно сам пример:
#include <iostream>
#include <thread>

void threadFunction(int &a)
{
     a++;
}

int main()
{
     int a = 1;
     std::thread thr(threadFunction, std::ref(a)); // что делает функция ref()? почему нельзя передовать просто переменную по ее имени?
     thr.join();
     std::cout << a << std::endl;
     return 0;
}

добавлено позже
при передачи просто по имени std::thread thr(threadFunction, a); программа не компилируется и падает с ошибкой

A:

По имени - сохранится значение. А вам нужно просто синоним для той же области памяти. В результате, когда отработает threadFunction у вас напечатается 2. Если убрать std::ref, то 1.
А вот тут более детальеное объяснение:

Третья задача решается с помощью шаблонных функций std::ref и
  std::cref объявленных в заголовке <functional>. Первая возвращает
  ссылку на объект, вторая возвращает константную ссылку. Эти функции
  очень часто нужны при работе, например, с std::bind. Причина одна -
  передать в связыватель ссылку, а не копию объекта. Если Вы работаете с
  потоками (std::thread) и Вам нужно передать аргументы по ссылке при
  инициализации объекта потока, Вам также понадобятся функции std::ref и
  std::cref.

