В настоящее время он печатает 0, потому что в момент, когда вы вызываете std :: bind, он не знает, что вы хотите передать ссылку. Он не смотрит на сигнатуру функции, чтобы увидеть, какие типы параметров она принимает, и соответственно корректировать.
Для правильной работы звоните
void f(int &a) { a = 1; }
int main() {
int a = 0;
std::bind(f, std::ref(a))();
std::cout << a << std::endl;
}
C ++ 0x предлагает «идеальное связывание», но в этом есть огромная опасность, которая может привести к серьезному нарушению существующего кода в молчании, основанном на настоящем поведении. Вот очень простой пример.
void myCallback( const std::string& str, int i );
function< void(int) > makeCallback( const std::string & str )
{
return bind( myCallback, str, _1 );
}
В настоящее время вы можете положиться на то, что bind скопирует строку, которую вы передаете с str
, и, следовательно, факт, что она будет действительной, наступит после вызова обратного вызова.
Если бы он «умно» использовал «идеальное связывание» для сохранения его в качестве ссылки, это могло бы нарушить подобные ситуации.