Я читаю эта ссылка Страуструпа со следующим кодом:
class X {
int a;
public:
X(int x) { if (0<x && x<=max) a=x; else throw bad_X(x); }
X() :X{42} { }
X(string s) :X{lexical_cast<int>(s)} { }
// ...
};
Мой вопрос о линии:
X() X{42}{}
Есть ли различия между скобками и фигурными скобками?
Если нет различий, могу ли я использовать фигурные скобки и в других вызовах функций? Или это только в делегировании конструктора?
И наконец, почему у нас должен быть оба синтаксиса? Это немного неоднозначно.
()
использования инициализация значения если круглые скобки пусты, или прямая инициализация если не пусто.
{}
использования инициализация списка, что подразумевает инициализация значения если скобки пусты, или агрегатная инициализация если инициализированный объект является агрегатом.
Так как ваш X
это простой int
нет никакой разницы между инициализацией ()
или же {}
,
Значения инициализации могут быть указаны в скобках или фигурных скобках.
Инициализация фигурных скобок была введена в C ++ 11, и она подразумевает «равномерную инициализацию», которая может использоваться для всех нестатических переменных.
Скобки могут использоваться вместо скобок или знака равенства и вводятся для повышения единообразия и уменьшения путаницы.
Это всего лишь синтаксическая конструкция, которая не приводит к повышению производительности или штрафам.