Делегирование конструкторов в C++ () или {}

я прочитала этой ссылке из Страуструп со следующим кодом:

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}{}

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

2 ответов


() использует инициализация значением если скобки пустые, или прямой инициализации если не пуста.

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

поскольку X простой int, нет никакой разницы между инициализацией его с помощью () или {}.


значения инициализации могут быть указаны в скобках или скобках.

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

скобки могут использоваться вместо круглых скобок или знака равенства и были введены для повышения однородности и уменьшения путаницы.

Это только синтаксическая конструкция и не приводит к преимуществам производительности или штрафы.