내가 추측 할 수있는 것은, 추측 할 수있는 것은 그것이 rvalue 참조 및 전달 참조가 어디에 추가되는지는 C++에 추가 되었기 때문입니다.
그래서 API의 일부에서 전달 참조가 있고 일부는 전달 참조가 있습니다.
하나의 작은 장점이있다 : F
의 복사 생성자가 std::function(F const&)
가 될 수는 없지만 이동이, std::function(F)
가 던져하지 보장 할 수 없습니다 동안 던질 수 있다면. 차이점은 복사가 template<class F> function(F)
경우 생성자 외부에서 수행되지만 비례 값이 전달되는 경우 template<class F> function(F&&)
경우에는 생성자 내부에서 복사가 수행된다는 점입니다.
이럴만 한 이유는 아닙니다.
또한 SFINAE 동작을 function(F)
으로 지정하는 것이 더 쉽지만 C++ 11 이후까지 공식화되지 않았으므로 그럴 수 없습니다.
template<class F>function(F)
에 대한 비용은 낮습니다. 완벽한 전달 버전보다 F
이 하나 더 많습니다. 특히 누군가의 우선 순위 목록이 변경되지 않았을 가능성이 있습니다 (특히 " "function(F)
의 테스트 결과 이론적으로 실제로 이상한 코드가 깨질 수 있습니다.
그러나'std :: function'에는 다중 생성자와 다중 연산자 =가 있습니다. 이동 연산자 =에 해당하는 이동 생성자를 포함합니다. – michalsrb
@michalsrb 그의 예제에서'F &&'는 r 값 참조가 아닙니다 –
같은 질문이 https://groups.google.com/a/isocpp.org/forum/#!topic/에서 요청 된 것 같습니다. std-discussion/ozZQh6dEsiA –