2013-06-20 2 views
3

Мое приложение имеет раздел, который напоминает следующий кодПовышения темы - передача параметров по ссылке

void SomeClass::OtherMethod(std::vector<std::string>& g) 
{ 
    g.pushback("Something"); 
} 

void SomeClass::SomeMethod() 
{ 
    std::vector<std::string> v; 
    boost::thread t(boost::bind(&SomeClass::OtherMethod,this,v) 
    t.join(); 
    std::cout << v[0]; //Why is this empty when the vector created on stack 
} 

Я хотел бы знать, почему вектор v пуст, когда вектор создается на стеке и он работает, когда он создается в куче. Я ожидал, что вышеприведенный код будет работать, поскольку вектор остается в области видимости даже тогда, когда он создан в стеке.

ответ

10

Bind копирует свои параметры. Используйте boost::ref:

boost::thread t(boost::bind(&SomeClass::OtherMethod,this, boost::ref(v)) 
+0

Спасибо за ваш ответ. Однако я все еще не понимаю. Если bind копирует свой параметр, как это имеет значение. Извините, я здесь смущен – MistyD

+0

@MistyD Теперь он копирует 'reference_wrapper', который принимает свой аргумент (т. Е. Ваш вектор) по ссылке и предоставляет неявный оператор T-type-cast. –

+0

Я понимаю, что 'boost :: ref' будет делать трюк. Мне просто интересно, почему он не работает без него. Вы заявили, что без использования boost :: ref он сделает копию. Мне просто интересно, что, даже если он делает копию, почему она не работает? – MistyD

0

Поток по умолчанию принимает аргументы по значению, даже если сама функция ожидает ссылку. Используйте boost :: ref(), чтобы принудительно передать аргумент по ссылке.

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

A. Williams, «Concurrency in Action», 2.2 Передача аргументов функции потока.

Смежные вопросы