Подтвердить что ты не робот

Значит ли знак равенства знаменует собой инициализацию скобок? например. 'T a = {}' vs 'T a {}'

Вот два способа инициализации переменной в С++ 11:

T a {something};
T a = {something};

Я тестировал эти два во всех сценариях, о которых я мог думать, и я не заметил различий. Этот ответ предполагает, что между ними есть тонкая разница:

Для переменных я не уделяю много внимания стилям T t = { init }; или T t { init };, я считаю, что разница незначительна и в худшем случае приведет к полезному сообщению компилятора о неправильном использовании явного конструктора.

Итак, есть ли разница между двумя?

4b9b3361

Ответ 1

Единственное существенное отличие, которое я знаю, заключается в обработке конструкторов explicit:

struct foo
{
    explicit foo(int);
};

foo f0 {42};    // OK
foo f1 = {42};  // not allowed

Это похоже на "традиционную" инициализацию:

foo f0 (42);  // OK
foo f1 = 42;  // not allowed

См. [over.match.list]/1.


Кроме того, есть дефект (см. CWG 1270) в С++ 11, который позволяет скобку только для формы T a = {something}

struct aggr
{
    int arr[5];
};

aggr a0 = {1,2,3,4,5};  // OK
aggr a1 {1,2,3,4,5};    // not allowed