이 세 컨테이너는 모두 값 또는 전달 참조가 아닌 const 참조로 함수 객체를 허용합니다. 따라서 함수 객체를 컨테이너의 내부 저장소에 복사해야합니다 (최대 두 번).std :: map, std :: set 및 std :: priority_queue의 비교 연산자
함수 개체를 두 번 복사하는 이유가 있습니까? 사용자가 모든 유형의 함수 객체를 전달하고이를 내부 펑터 저장소에 구성 할 수있는 능력을 부여하는 것과는 반대의 개념입니까? 그렇게하면 도서관이 더 일반화되고 사용자에게 놀라움이 덜합니다.
동일한 철학 push_back()
함수에 적용된다 - 이것은 사용자에게 그들이 값 이동할 또는 복사 여부에 대한 더 많은 제어를 제공하기 때문에 그들이 두 과부하하는 CONST 참조 하나과 r- 수치의 참조를 가질 가치. 도서관은 유스 케이스에 대한 어떠한 가정도하지 않고 일반적인 경우에도 효율적이다.
이것이 C++ 이전 11 일 이후로 이월 된 디자인 결정이라고 생각됩니다. 이것이 표준에 대한 적절한 제안이 될까요?
왜 내부적으로 복사하는 경우에만 std :: thread 생성자가 rvalue 참조로 펑터를 수락합니까? 그리고 우리는 더 많은 생성자를 추가하지 않을 것입니다. 단지 전달 생성자에 의해 매개 변수를 받아들이도록 기존 생성자를 변경하는 것입니다. 그것들이 깨질 지 확신 할 수는 없지만 .. – Curious
@Curious'thread'는 임의의 함수를 취하는 하나의 생성자를 가지고 있습니다. 'map'은 'Compare'또는 'Allocator'를 취하는 4 개의 생성자와 비슷합니다 - 모두를 변경해야합니다. 이것은 더 복잡하고 ABI를 깰 수 있습니다. – Barry
정확히 ABI를 어기 는가? 비 rvalue를 전달하면 비교기는 이전과 같이 복사됩니다. – Curious