표준 라이브러리에서 어떤 탐욕스러운 초기화 라이더리스트 예제가 숨어 있습니까?

StackOverflow https://stackoverflow.com/questions/19847960

문제

C ++ 11 이후 표준 라이브러리 컨테이너 및 std::string 생성자가 초기화 목록을 취하는 것을 가지고 있습니다. 이 생성자는 다른 생성자보다 우선합니다 (주석에서 @johannesschaub-litb가 지적한 바와 같이 다른 "Best Match"기준을 무시하더라도). 이것은 모든 괄호를 변환 할 때 잘 알려진 몇 가지 함정으로 이어집니다. () 브레이스 버전에 대한 생성자 형태 {}

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>

void print(std::vector<int> const& v)
{
    std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, ","));
    std::cout << "\n";
}

void print(std::string const& s)
{
    std::cout << s << "\n";
}

int main()
{
    // well-known 
    print(std::vector<int>{ 11, 22 });  // 11, 22, not 11 copies of 22
    print(std::vector<int>{ 11 });      // 11,     not 11 copies of 0

    // more surprising
    print(std::string{ 65, 'C' });      // AC,     not 65 copies of 'C'
}

이 사이트에서 세 번째 예제를 찾을 수 없었고 라운지에서 일이 나타났습니다.u003CC++> 채팅 (@rightfold, @abyx 및 @jerrycoffin과의 토론)에서 다소 놀라운 것은 변환하는 것입니다. std::string 생성자는 카운트와 사용할 캐릭터를 취합니다 {} 대신에 (), 그 의미가 바뀝니다 n 캐릭터의 사본 n-TH 캐릭터 (일반적으로 ASCII 테이블에서)와 다른 문자가 뒤 따릅니다.

65는 char로 표현 될 수있는 일정한 표현이며 int (§8.5.4/7, Bullet 4) (감사합니다 @jerrycoffin에).

의문: 변환하는 표준 라이브러리에 숨어있는 더 많은 예가 있습니까? () 스타일 생성자 {} 스타일, 초기화 목록 생성자와 탐욕스럽게 일치합니까?

도움이 되었습니까?

해결책

나는 당신의 예를 가지고 있다고 가정합니다 std::vector<int> 그리고 std::string 당신은 다른 컨테이너 (예 : std::list<int>, std::deque<int>, 같은 문제가있는 등은 분명히 std::vector<int>. 마찬가지로, int 적용되는 유일한 유형은 아닙니다 char, short, long 그리고 그들의 unsigned 버전 (아마도 몇 가지 다른 통합 유형).

나도 있다고 생각합니다 std::valarray<T> 그러나 나는 확실하지 않습니다 T 통합 유형이 허용됩니다. 사실, 나는 이것들이 다른 의미를 가지고 있다고 생각합니다.

std::valarray<double>(0.0, 3);
std::valarray<double>{0.0, 3};

몇 가지 다른 표준 C ++ 클래스 템플릿이 있습니다. std::initializer_list<T> 인수로서, 나는 이것들 중 어느 것도 교정기 대신 괄호를 사용할 때 사용될 과부하 생성자가 있다고 생각하지 않습니다.

다른 팁

발생을 검색하는 것입니다 initializer_list.

  • 모든 시퀀스에는 벡터와 같은 생성자가 있습니다.

    • Deque
    • Dynarray
    • Forward_List
    • 목록
    • 벡터
  • 발라 레이

  • Basic_string

  • 순서가없는 컬렉션에는 초기 버킷 수를 결정하기 위해 정수를 사용하는 생성자가 있습니다.

    • UNORDERED_SET
    • UNORDERED_MULTISET

그게 다야한다고 생각합니다.

#include <unordered_set>
#include <iostream>

int main() {
    std::unordered_set<int> f (3);
    std::unordered_set<int> g {3};
    std::cout << f.size() << "/" << g.size() << std::endl; // prints 0/1.
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top