Почему мне не нужно std :: move для функции std :: bind'ed? - PullRequest
1 голос
/ 05 января 2012

Допустим, у меня есть функция, принимающая ссылку на rvalue:

void whatever (std::unique_ptr<int>&&) {
    // Nothing!
}

... и я привязываю один ее параметр к заполнителю.

auto f = std::bind(&whatever, _1);

Я пробовал вызовыкак это, и результат противоположен тому, что я ожидал.

std::unique_ptr<int> nothing;
f(std::move(nothing));  // Fails to compile!
f(nothing);             // Works, but seems wrong!

Это ошибка компилятора?Или рабочий код небезопасен?Или почему мне не нужно std::move этот указатель на связанную функцию?

Между прочим, ошибка компиляции с gcc4.4:

test.cxx:14: error: no match for call to '(std::_Bind<void (*(std::_Placeholder<1>))(std::unique_ptr<int, std::default_delete<int> >&&)>) (std::unique_ptr<int, std::default_delete<int> >)'

1 Ответ

5 голосов
/ 05 января 2012

Я получаю только противоположные результаты при использовании libc ++ .

std::unique_ptr<int> nothing;
f(std::move(nothing));  // Works!
f(nothing);             // Fails to compile!

Я считаю, что это ошибка gcc4.4. [func.bind.bind] / p10 / b3 описывает этот случай:

  • если значение j из is_placeholder<TiD>::value не равно нулю, аргумент равен std::forward<Uj(uj)>, а его тип Vi равен Uj&&;

Это может быть исправлено в более позднем gcc (я понятия не имею).

...