Вот два способа инициализации переменной в C ++ 11:
T a {something};
T a = {something};
Я проверил эти два во всех сценариях, о которых я мог думать, и я не заметил разницу. Этот ответ предполагает, что есть тонкая разница между этими двумя:
Для переменных я не обращаю особого внимания между
T t = { init };
или жеT t { init };
Стили, я нахожу разницу незначительной и в худшем случае приведет только к полезному сообщению компилятора о неправильном использовании явного конструктора.
Итак, есть ли разница между этими двумя?
Единственное существенное различие, которое я знаю, заключается в лечении 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) в C ++ 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
Других решений пока нет …