std :: initializer_list가 할당 매개 변수로 사용될 때 참조 유형이 아닌 이유는 무엇입니까?

왕위

다음은 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에 사용 된 매개 변수도이 책에서와 같이 참조가 아닌 값인 것 같습니다. 그런데 왜? 참조를 사용하는 것이 더 효율적이지 않습니까?

Shafik Yaghmour

std :: initializer_list에 대한이 참조를 보면 다음과 같이 표시됩니다.

이니셜 라이저 목록은 포인터 쌍 또는 포인터와 길이로 구현 될 수 있습니다. std :: initializer_list 복사는 기본 객체를 복사하지 않습니다.

포인터 또는 포인터 및 길이 쌍을 복사하는 것이 그리 비싸지 않기 때문에 값으로 전달되는 이유에 대한 강력한 힌트를 제공합니다. 인용구는 실제로 초안 표준 섹션 18.9 Initializer가 단락 2를 나열합니다 .

이전 제안 중 하나를 살펴보면 동일한 이유를 찾을 수 있습니다.

initializer_list는 작은 객체 (아마 두 단어)이므로 값으로 전달하는 것이 합리적입니다. 값으로 전달하면 begin () 및 end ()의 인라인과 size ()의 상수 표현식 평가가 단순화됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관