2011-08-12 4 views
3

나는 C++0x faq을 읽고 이니셜 라이저 목록을 자세히 설명하는 섹션을 보았습니다. 그러나,도 나열C++ 0x의 새로운 기능인 "var {args}"로 초기화 되었습니까? 아니면 단순한 구문 설탕입니까?

vector<int> vi = { 1, 2, 3 }; 
vector<int> vj({1, 2, 3}); 
// etc. 

형태였다 : 예는의 변화가 대부분이었다

vector<int> vk{2}; 

이 양식은 자주 묻는 질문에 다른 곳에서 나타나고, 나는 그것이에서 의미 다른 여부에 대해 궁금합니다 처음 두 형식, 또는 vk({x, y, z})에 대한 구문 식 설탕.

답변

1

하나는 균일 초기화이고이고 다른 하나는 이니셜 라이저 목록입니다. 그들은 볼 수 있듯이 비슷한 구문을 생성 할 수 있지만 두 가지가 다릅니다.

vector<int> vk{2}; 

은 균일 한 초기화입니다. 다른 두 개는 초기화 목록입니다.

+0

순수한 균일 초기화는 형태도있다 :'표준 : : 벡터 VK {1, 2, 3} ; ' –

+1

나에게 이해가 가지 않는다. '벡터 vk {2}'에서 이니셜 라이저 목록도 사용합니다. –

6

({1, 2, 3}) 양식은 vector<int>의 생성자를 직접 호출하고 첫 번째 인수로 {1, 2, 3}을 전달합니다. vector<int>이 그 첫 번째 매개 변수 initializer_list 또는 {1, 2, 3} (같은, 다른 컨테이너 클래스)에 의해 초기화 될 수있는 또 다른 유형의, 그것이 작동하지 않을 것입니다 생성자를하지 않았을 경우, 당신은 이상의 인수

vector<int> vk({1, 2, 3}, myAllocator); 

을 통과 할 수 있었다. 실제로는 vector<int>의 첫 번째 매개 변수가 initializer_list<int> 인 생성자가 있기 때문에 작동합니다. 이것은 당신이 괄호를 생략하면 정상적인 기능에,

void f(vector<int> const& vk); 
int main() { f({1, 2, 3}); } 

를 호출 vector<int> vk{1, 2, 3} 같이 정확한 의미는 클래스에 따라 달라집니다처럼입니다. vector<int>에는 초기화 자 목록 생성자가 있습니다.이 생성자는 첫 번째 매개 변수가 initializer_list<int> (선택적으로 참조)이고 기본 매개 변수가있는 다른 모든 매개 변수가있는 생성자입니다. 클래스에 그러한 생성자가있는 경우 이니셜 라이저 목록이 해당 생성자에 전달됩니다. 또는 클래스는 단순히 집계 일 수도 있습니다 (예 : struct A { int a; int b; int c; };, 이니셜 라이저 목록에서 멤버 초기화). 3int 인수를 허용하는 생성자가 있어야합니다. 그것은 명시 적으로 생성자를 사용하는 것을 금지하는 것을 제외

가 마지막으로 = { 1, 2, 3 } 형태, 버전 (즉, 단지 = 제거) 괄호를 생략 거의 동일합니다 (즉, 그들은 explicit vector(initializer_list<int>);로 선언했다거나, 그것은 것 대신 explicit vector(int, int, int);을 선언했다 = { 1, 2, 3 }을 사용하면 오류가 발생합니다.

0

균일 초기화 전환 데이터의 손실이 발생할 것입니다 변환을, 즉 축소 방지 :

#include <vector> 

std::vector<float> v{1.0F, 2.0F, 3.0F}; // OK: 

std::vector<float> w{1.0, 2.0, 3.0}; // OK: doubles could be put into floats without loss. 

std::vector<int> j{1.1, 2.2, 3.3}; // error: narrowing 

std::vector<int> k{1L, 2L, 3L}; // OK: the long numbers can be represented as int without loss. 

std::vector<int> l{0xfacebeefL, 0xdeadbabeL, 0xfadecabeL}; // error: narrowing. 
관련 문제