2016-09-13 2 views
8

std::function 형 소거 생성자 정의왜 std :: function 생성자와 할당간에 차이가 있습니까?</p> <pre><code>template< class F > function(F f); </code></pre> <p>할당 연산자는 다음과 같이 정의된다 :로

template< class F > 
function& operator=(F&& f); 

(소스 cppreference)

왜 생성자 값 f을 얻는다 않는 operator= 반면 전달 참조로 f을 얻으시겠습니까?

+2

그러나'std :: function'에는 다중 생성자와 다중 연산자 =가 있습니다. 이동 연산자 =에 해당하는 이동 생성자를 포함합니다. – michalsrb

+2

@michalsrb 그의 예제에서'F &&'는 r 값 참조가 아닙니다 –

+1

같은 질문이 https://groups.google.com/a/isocpp.org/forum/#!topic/에서 요청 된 것 같습니다. std-discussion/ozZQh6dEsiA –

답변

3

내가 추측 할 수있는 것은, 추측 할 수있는 것은 그것이 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)의 테스트 결과 이론적으로 실제로 이상한 코드가 깨질 수 있습니다.

+0

하지만 그렇다면 왜 C++에서'std :: function :: assign'이 사용되지 않을까요?하지만 생성자의 서명은 변경되지 않았습니까? 이는 누군가가'std :: function' API를 개선하는 것에 대해 약간의 생각을했음을 의미하지만 아직 그들은 복사 가능 호출 생성자를 변경하지 않고 남겨 둡니다 –

관련 문제