Подтвердить что ты не робот

Почему передаваемые объектные ссылки на функцию потока не удается скомпилировать?

Я столкнулся с проблемой, используя новый интерфейс С++ 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);

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

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: из-за ошибки компиляции он, кажется, исходит из удаленного конструктора...

4b9b3361

Ответ 1

Темы скопировать свои аргументы (подумайте об этом, The Right Thing). Если вы хотите ссылку явно, вы должны обернуть ее с помощью std::ref (или std::cref для постоянных ссылок):

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

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

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

Ответ 2

void foo(intstd::ostream &os)

не похож на действительный С++ для меня.