2014-11-07 3 views
3

'A Tour of C++'을 거쳤으며 Bjarne는 생성자의 멤버 초기화에서 C++ 11 이니셜 라이저 목록 기능을 사용합니다 (예 : 중괄호 사용).) :멤버 초기화 목록 (C++ 11)의 이니셜 라이저 목록 구문

A a; 
B b; 
Foo(Bar bar): 
    a{bar.a}, b{bar.b} 
{} 

그러나 이것은 C++ 11 이전에는 컴파일되지 않습니다.

Foo(Bar bar): 
    a(bar.a), b(bar.b) 
{} 

그래서 차이점은 무엇입니까 때 하나가 다른 하나보다 선호한다 : 기존 멤버 초기화 목록의 차이 (사용 둥근 괄호) 란 무엇입니까?

+3

'A a {bar.a};와'A a (bar.a);와 동일합니다. – chris

+1

Bjarne는 둥근 브래킷 초기화 팬이 전부입니다. – AndyG

+1

중괄호는 "가장 애매한 구문 분석"문제를 피하지만, std :: vector를 사용하여 답안에서 지적되는 성가신 문제를 소개합니다. http://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization – amdn

답변

8

그래서 차이점은 무엇입니까?

둥근 괄호는 클래스가 아닌 유형 또는 괄호 안의 인수 개수에 적합한 생성자가있는 유형에서만 작동합니다.

위의 중괄호는 집합 적으로 작동하며 집합체는 단순한 struct이거나 생성자가없는 배열 유형입니다.그래서 다음과 같은 작동합니다 :

마지막으로
struct { 
    int a,b; 
} aggregate; 
int array[2]; 

Foo() : aggregate{1,2}, array{3,4} {} 

, 중괄호는 오히려 인수와 일치하는 매개 변수 (들) 생성자보다 initializer_list을 적절히 형식의 복용 생성자를 일치합니다. 예를 들어 :

std::vector<int> v1; 
std::vector<int> v2; 

Foo() : 
    v1(10,2), // 10 elements with value 2 
    v2{10,2} // 2 elements with value 10,2 
{} 

때 하나가 다른 하나보다 선호되어야 하는가?

초기화가 집계가 아닌 생성자를 사용하고 있다는 것을 명확하게하려면 둥근 괄호를 사용하십시오 (initializer_list). 또는 특정 생성자의 사용을 강요합니다.

다른 형식으로 지원되지 않는 초기화 형식이 필요할 때 중괄호를 선호합니다. 또는 당신은 단지 "올바른 일을"초기화를 원할 때.

둘 다 똑같은 경우, 선택은 크게 미적입니다.

+3

목록 초기화가 전환을 좁히는 것을 금지한다는 것을 지적하고 싶습니다. – Casey

0

간단한 설명은 다음과 같습니다. 회원 초기화 목록의 표기법은 다른 곳에서 초기화 된 변수의 표기법과 일치합니다.이 을 의도

  1. 통합 초기화 구문 : 슬프게도, 그것은 무엇에 대한 설명은 생성자 호출에 중괄호의 사용과 관련된이 명 다소 충돌하는 변경이 있기 때문에 전혀 쉽지 않다 모든 구조체에 중괄호를 사용하게하고, 기본 인수이거나 유형에 생성자가 전혀없고 직접 초기화가 사용 되더라도 해당 생성자를 호출합니다.
  2. 가변 개수의 인수를 지원하려면 괄호/중괄호를 추가로 사용하지 않고 std::initializer_list<T>을 제공하려면 중괄호를 사용할 수 있습니다. std::initializer_list<T> (적절한 유형 T)을 사용하는 생성자가있는 경우 중괄호를 사용할 때이 생성자가 사용됩니다. 더std::initializer_list<T> 생성자 있지만 괄호와 중괄호의 사용이 동등 다른 사용자 정의 생성자가 가없는 경우

는 다르게 넣습니다. 그렇지 않으면 std::initializer_list<T> 생성자를 호출합니다. ... 그리고 전체 초기화가 실제로 복잡하기 때문에 몇 가지 세부 사항을 놓치고 있습니다.

2

정말 짜증나는 가장자리의 경우 차이 될 수 있습니다에 관계없이 함수 단지 변수 또는 초기화 클래스의 구성원 v 여부 및 u의 사실이다

std::vector<int> v{3, 2}; // constructs a vector containing [3, 2] 
std::vector<int> u(3, 2); // constructs a vector containing [2, 2, 2] 

초기화 목록에서.

그러나 동일한 수의 인수를 사용하는 일반 생성자와 std::initializer_list<T> 생성자가 겹치는 경우 외에는 차이가 없습니다.

관련 문제