2014-11-21 14 views
4

} ideone 볼 같이C++ 11 : 문자열 (50 'X') 문자열 대 {50, 'X'

cout << string(50, 'x'); // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
cout << string{50, 'x'}; // 2x 

WAT을 ??

cout << static_cast<int>('2'); // 50 
cout << static_cast<char>(50); // 2 

하지만 그건 지금까지의 내가있어 같이이다 :

나는 50 그렇게 ASCII의 '2'라는 것을 알아 낸.

C++ 11 이니셜 라이저에 대한 확실한 인수로 연결됩니까?

+2

'string'의'initializer_list' 생성자는 문자의리스트를 취합니다. –

+1

(여기 [관련 문서가 있습니다.] (http://en.cppreference.com/w/cpp/string/basic_string/basic_string)) –

+2

마지막 줄에 대답하려면 : 아니요. 단지 그들이하는 일을 이해해야한다는 의미입니다. – Cubic

답변

6

string { 50, 'x' }을 수행하면 본질적으로 문자 목록으로 문자열을 초기화합니다.

한편 string(50, 'x')x 문자를 50 번 반복하도록 정의 된 2 개의 인수 생성자를 호출합니다. string { 50, 'x' }이 생성자를 선택하지 않는 이유는 모호 할 수 있기 때문입니다. 세 개의 매개 변수 생성자가 있다면 어떻게 될까요? 유형에 initializer_list 생성자가있는 경우 초기화를 위해 { ... }을 사용하면 해당 유형이 선택됩니다.

기본적으로 유형에 포함 된 생성자를 알아야합니다. initializer_list 생성자는 모호성을 피하기 위해 항상 우선 순위를 갖습니다.

+1

좁은 변환으로 인해'{50, 'x'}'std :: initializer_list '로 변환 할 수 없습니까? –