다음은 C ++ Primer 5th Edition (P.564)입니다.
예를 들어 복사 및 이동 할당 연산자 외에도 라이브러리 벡터 클래스는 중괄호 요소 목록을 사용하는 세 번째 할당 연산자를 정의합니다 (§ 9.2.5, p. 337). 이 연산자를 다음과 같이 사용할 수 있습니다.
vector<string> v; v = {"a", "an", "the"};
이 연산자를 StrVec 클래스 (§ 13.5, p. 526)에도 추가 할 수 있습니다 .
class StrVec { public: StrVec &operator=(std::initializer_list<std::string>); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ };
읽는 동안 여기에 사용 된 매개 변수가 예상대로 참조가 아니라 값이라는 것을 알았습니다. 그래서 나는 stl 라이브러리 코드로 std::vector
갔다. 다음은 파일에서 찾은 것입니다 stl_vector.h
.
/**
* @brief Builds a %vector from an initializer list.
* @param __l An initializer_list.
* @param __a An allocator.
*
* Create a %vector consisting of copies of the elements in the
* initializer_list @a __l.
*
* This will call the element type's copy constructor N times
* (where N is @a __l.size()) and do no memory reallocation.
*/
vector(initializer_list<value_type> __l,
const allocator_type& __a = allocator_type())
: _Base(__a)
{
_M_range_initialize(__l.begin(), __l.end(),
random_access_iterator_tag());
}
std :: vector에 사용 된 매개 변수도이 책에서와 같이 참조가 아닌 값인 것 같습니다. 그런데 왜? 참조를 사용하는 것이 더 효율적이지 않습니까?
std :: initializer_list에 대한이 참조를 보면 다음과 같이 표시됩니다.
이니셜 라이저 목록은 포인터 쌍 또는 포인터와 길이로 구현 될 수 있습니다. std :: initializer_list 복사는 기본 객체를 복사하지 않습니다.
포인터 또는 포인터 및 길이 쌍을 복사하는 것이 그리 비싸지 않기 때문에 값으로 전달되는 이유에 대한 강력한 힌트를 제공합니다. 인용구는 실제로 초안 표준 섹션 18.9
Initializer가 단락 2를 나열합니다 .
이전 제안 중 하나를 살펴보면 동일한 이유를 찾을 수 있습니다.
initializer_list는 작은 객체 (아마 두 단어)이므로 값으로 전달하는 것이 합리적입니다. 값으로 전달하면 begin () 및 end ()의 인라인과 size ()의 상수 표현식 평가가 단순화됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다