2015-01-15 2 views
2

Я видел код, где программист, используемый в фигурные скобки, чтобы инициализировать переменнуюЕсть ли разница между присвоением значения переменной с использованием оператора равенства или использованием фигурных скобок?

int var{ 5 }; 

вместо того, чтобы использовать оператор присваивания

int var = 5; 

Я знаю, назначив значение LHS переменной с помощью фигурных скобок является C Синтаксис ++ 11. Есть ли разница между использованием двух?

Благодарим за ответы.

+5

Один из них является инициализацией списка, а другой нет. –

ответ

6

Они разные виды инициализации:

T a{b}; // list initialization 
T a = b; // copy initialization 
T a(b); // direct initialization 

Там нет никакой разницы для int с, но есть, конечно, может быть различия для других типов. Например, инициализация копирования может завершиться неудачно, если ваш конструктор равен explicit, тогда как остальные два будут успешными. Инициализация списка запрещает сужение конверсий, но для остальных двух это нормально.

2

Насколько я знаю, для целых чисел нет разницы. Синтаксис {} был составлен для (но не ограничивается этим, поскольку он также используется для initializer_list) предотвращает запуск программистов http://en.wikipedia.org/wiki/Most_vexing_parse, поэтому вместо std::vector<int> v() для инициализации v вы пишете std::vector<int> v{};.

{} имеет различное поведение в зависимости от использования, это может быть вызов конструктора, список инициализаторов и даже список значений для инициализации членов пользовательского класса в порядке определения.

Пример последние:

class Q{ 
public: 
    int a; 
    int b; 
    float f; 
}; 

int main() 
{ 
    Q q{2, 5, 3.25f}; 
} 
Смежные вопросы