나는 std::bind
의 std::move
을 std::unique_ptr
에두고 있습니다. 결과 함수 객체는 불변 인 것으로 보이므로 함수를 호출 할 때 이동을 수행하는 것은 불가능합니다.std :: bind의 가변 버전이 있습니까?
이것이 람다가 기본적으로 변경 불가능한 이유와 동일한 이유 때문이라고 생각됩니다. 호출 할 때마다 동일한 작업을해야합니다. 그러나 그들이 변경 가능해야하는 경우가 있으므로, 우리는 mutable
키워드를 가지고 있습니다.
void foo(std::unique_ptr<int>&& ptr)
{
cout << *ptr << endl;
}
int main()
{
std::unique_ptr<int> ptr = std::make_unique<int>(123);
std::bind(foo, std::move(ptr))(); // Doesn't compile
[&ptr]() { foo(std::move(ptr)); }(); // Equivalent, doesn't compile
[&ptr]() mutable { foo(std::move(ptr)); }(); // Compiles
return 0;
}
Instad는 bind
를 사용하는 나는 변경 가능한 람다의 함수 호출을 래핑 할 수있다. 그러나 나에게 최소한 개인적으로 bind
은이 경우 훨씬 더 깔끔하고 단순 해 보인다.
변경 가능한 람다를 두 번 호출하면 정의되지 않은 동작이 발생할 수 있다는 것을 이해합니다. 이미 이동 된 포인터에서 다시 이동하기 때문입니다. 하지만 제 경우에는 펑터가 한 번만 호출된다는 것을 알고 있습니다.
이렇게하려면 std::bind
을 사용할 수있는 방법이 있습니까? 종류가 bind_mutable
입니까? 그렇지 않다면 어떻게 직접 작성해야합니까?
귀하의 주장이 잘못되었습니다. 둘 다 람다 작품 : [Demo] (http://coliru.stacked-crooked.com/a/b21ee8e7d660955b). bind에 필요한 것은'rvalue_refence_wrapper'입니다. [is-there-a-reference-wraval-for-rvalue-references] (https://stackoverflow.com/questions/5126219/is-there-a-reference-wrapper-for-rvalue-references)를 참조하십시오. – Jarod42
[tag : C++ 11]에 실제로 갇혀 있습니까? 아니면 컴파일러에 [tag : C++ 14] 기능이 있습니까? 여기에서'bind '에 대한 필요성은 기본적으로 [tag : C++ 14]에서 사라 졌기 때문에. – Yakk