Почему передача аргументов ссылки на объект в функцию потока не компилируется? - PullRequest
29 голосов
/ 28 ноября 2011

Я столкнулся с проблемой при использовании нового интерфейса c ++ 11 std::thread.
Я не могу понять, как передать ссылку на std::ostream в функцию, которую будет выполнять поток.

Вот пример с передачей целого числа (скомпилируйте и работайте, как ожидается в gcc 4.6):

void foo(int &i) {
    /** do something with i **/
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

Но когда я пытаюсь передать ostream, он не компилируется:

void foo(std::ostream &os) {
    /** do something with os **/
    os << "This should be printed to os" << std::endl;
}

std::thread t(foo, std::cout);

Есть ли способ сделать это, или это вообще невозможно?

NB. Похоже, что из-за ошибки компиляции произошел удаленный конструктор ...

1 Ответ

50 голосов
/ 28 ноября 2011

Потоки Скопируйте их аргументы (подумайте об этом, это правильно).Если вы хотите явно указать ссылку, вы должны заключить ее в std::ref (или std::cref для константных ссылок):

std::thread t(foo, std::ref(std::cout));

(Оболочка ссылки - это обертка с семантикой значения вокруг ссылки.есть, вы можете копировать оболочку, и все копии будут содержать одну и ту же ссылку.)

Как обычно, этот код верен только до тех пор, пока объект, на который вы ссылаетесь, остается живым.Будьте бдительны.

...