2013-05-27 4 views
4

В GotW # 6b части 2, мы находим кодДолжен ли я использовать инициализацию списка в списке инициализаторов конструктора?

class polygon { 
public: 
    polygon() : area{-1} {} 
    //.... 
    double area; 
}; 

Почему мы должны использовать инициализацию список для базовых типов вместо обычно используется area(-1)? Существуют ли какие-либо преимущества/ситуации, в которых они ведут себя по-разному?

+0

Если вы хотите вызвать конструктор списка инициализаторов? :) Я предполагаю, что это просто течет вместе со всем «единообразным» аспектом. – chris

+0

@chris должен был упомянуть 'area' является' double'. –

+0

Все еще считается ситуацией, когда она ведет себя по-другому, хотя, даже если она не является специфичной для списков инициализации конструктора. – chris

ответ

6

Почему мы должны использовать инициализацию списка для базовых типов вместо используемой области (-1)?

Прежде всего, я думаю, что есть сообщение о том, что единообразная инициализация C++ 11 должна использоваться всякий раз, когда она может быть использована. В этом случае это в основном вопрос стиля и вкуса.

Будет ли стиль и вкус, продвигаемые автором, стать стандартом de facto, который сложно сказать в настоящее время. Мы все знаем, что формальная инициализация не , что форма. С другой стороны, в большинстве ситуаций преимущества использования его в качестве стиля кодирования по умолчанию являются привлекательными - синтаксическая однородность плюс тот факт, что проблемы, такие как Most Vexing Parse, исчезают.

Это указано, когда список инициализаторов содержит только один элемент, инициализированный объект инициализируется из этого элемента (§ 8.5.4/3). Это делает инициализацию в вашем примере эквивалентной регулярной прямой инициализации (за исключением того, что сужение конверсий недопустимо).

Другими словами, area{-1} и area(-1) в вашем примере являются как прямыми инициализациями, так и эквивалентными. Выбор одного над другим - это только вопрос стиля.

Есть ли какие-либо преимущества/ситуации, в которых они ведут себя по-другому?

Как упоминалось выше, одна из ситуаций, когда они ведут себя по-разному, задаются инициализацией, которая включает в себя сужение конверсий. Например, в то время как это разрешено:

int x{42}; 

Это не так:

int y{3.14}; // ERROR! Narrowing conversion 
+0

Правильная инициализация списка - это то, что я имел в виду.На самом деле, я задал вопрос об этом некоторое время назад - http://stackoverflow.com/questions/13267277/where-can-we-use-list-initialization - должно быть, соскользнул с ума. –

+0

@ LuchianGrigore: ОК. Я отредактировал ответ, чтобы соответствовать редактированию на вопрос –

+0

@DyP: Упс, исправлено, спасибо :) –

3

Это не будет иметь значение для скаляров, но автор, вероятно, в соответствии с новым синтаксисом. Например, перед C++ 11 не удалось инициализировать массивы через список инициализации, но это может быть легко размещены через агрегатного инициализации:

struct A 
{ 
    A() : data{1, 2, 3} // this wouldn't work as 'data(1, 2, 3)' 
    {} 

    int data[3]; 
}; 

Кроме того, вы бы сделать то же самое для векторов.

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