2012-01-05 4 views
1

의 내가이를 rvalue 참조를 복용하는 기능을 가지고 있다고 가정 해 봅시다 :std :: bind'ed 함수로 이동해야하는 이유는 무엇입니까?

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와 컴파일 에러는, 그런데,이다 : libc++를 사용하는 경우 나 그 반대 결과를 얻을 수

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> >)' 

답변

5

.

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

저는 이것이 gcc4.4 버그라고 생각합니다. is_placeholder<TiD>::valuej가 0이 아닌 값이 인수 std::forward<Uj(uj)> 있으며 그 종류가 ViUj&& 인 경우

  • ; [func.bind.bind]/P10의/B3을 본 경우를 설명

최근의 gcc에서 수정 될 수 있습니다 (나도 모릅니다).

+0

흥미 롭습니다! 제가 작업하고있는 더 복잡한 경우가 있습니다. 결과는 주변 코드의 일부 부작용에 의존하는 것 같습니다. –

+1

그래, GCC 4.7에서 수정 된 것 같습니다. – Potatoswatter

+0

그건 그렇고, [func.bind.bind]/p10/b3에 대한 참조는 어떻게 찾습니까? 그것은 Google을 잘하지 않습니다. –