2015-05-07 5 views
3

Я имею в виду «The working draft N3337», который is said most similar to the published C++11 standard.C++ 11:() или {} в инициализации списка?

Если есть подходящие конструкторы, то он вызывает конструкторы.

Example (p200): 
struct S { 
    // no initializer-list constructors 
    S(int, double, double); // #1 
    S(); // #2 
    // ... 
}; 

S s1 = { 1, 2, 3.0 }; // OK: invoke #1 
S s2 { 1.0, 2, 3 }; // error: narrowing 

В противном случае он будет использовать агрегатную инициализацию.

Теперь here пример использования vector, который имеет явный конструктор из size_t и initializer_list конструктор:

vector<double> v1(7); // ok: v1 has 7 elements 
vector<double> v1{7}; // ok: v1 has 1 element (with its value 7.0) 

Здесь я запутался. Почему существует другое поведение для конструкторов vector, чем было для S?

+0

Я на 200% уверен, что это дубликат, но я не могу найти соответствующий Q/A. – Columbo

+0

@Columbo: возможно [этот] (http://stackoverflow.com/q/9723164/179910)? –

+0

@JerryCoffin Бинго, спасибо! – Columbo

ответ

3

Потому что перегрузка initializer_list настоятельно рекомендуется всем остальным. Из [over.match.list]:

Когда объекты не-агрегатного типа класса T являются список инициализируется (8.5.4), разрешение перегрузки выбирает конструктор в два этапа:

(1.1) - Изначально кандидатские функции представляют собой конструкторы-инициализаторы (8.5.4) класса T, а список аргументов состоит из списка инициализаторов как одного аргумента.
(1.2) - Если не найдено жизнеспособного конструктора-списка инициализатора, разрешение перегрузки выполняется снова, где функции-кандидаты являются всеми конструкторами класса T, а список аргументов состоит из элементов списка инициализаторов.

vector не является агрегатным классом, который имеет два соответствующих конструкторов:

explicit vector(size_type count);   // (3) 
vector(std::initializer_list<T> init,  // (7) 
    const Allocator& alloc = Allocator()); 

на основе упорядочения, описанном в [over.match.best], так как (7) является реальным кандидатом конструктора , мы не можем указать (1.2), где (3) будет рассмотрено.

+0

спасибо. Теперь я нахожусь в объявлении,() не может работать, только {} может работать. – user1914692

+0

@ user1914692 Пожалуйста, не изменяйте свой вопрос, чтобы задать другой вопрос. Если у вас есть новый вопрос, задайте новый вопрос. – Barry

 Смежные вопросы

  • Нет связанных вопросов^_^