Различные типы инициализации в С++

Я изучаю С++ и довольно путаюсь в отношении разных типов инициализации.

Вы можете сделать:

T a;

который, насколько я могу судить, иногда инициализирует a, а иногда не будет, в зависимости от того, имеет ли T конструктор по умолчанию.

Вы также можете сделать:

T a(); // or
T a(1, 2, 3... args);

; (в некоторых случаях):

T a = 1; // implicitly converted to T sometimes?

; если нет конструктора:

T a = {1, 2, 3, 4, 5, 6};

; а также:

T a = T(1, 2, 3);

.

Если вы хотите выделить в куче,

T a = new T(1, 2, 3);

Есть ли что-нибудь еще?

Я хотел бы знать, если: a) у меня есть все типы инициализации и b) когда использовать каждый тип?

Ответ 1

Вы сделали несколько ошибок. Я проясню их.

// Bog-standard declaration.
// Initialisation rules are a bit complex.
T a;


// WRONG - this declares a function.
T a();

// Bog-standard declaration, with constructor arguments.
// (*)
T a(1, 2, 3... args);

// Bog-standard declaration, with *one* constructor argument
// (and only if there a matching, _non-explicit_ constructor).
// (**)
T a = 1;

// Uses aggregate initialisation, inherited from C.
// Not always possible; depends on layout of T.
T a = {1, 2, 3, 4, 5, 6};

// Invoking C++0x initializer-list constructor.
T a{1, 2, 3, 4, 5, 6};

// This is actually two things.
// First you create a [nameless] rvalue with three
// constructor arguments (*), then you copy-construct
// a [named] T from it (**).
T a = T(1, 2, 3);

// Heap allocation, the result of which gets stored
// in a pointer.
T* a = new T(1, 2, 3);

// Heap allocation without constructor arguments.
T* a = new T;

Ответ 2

T a = 1;//неявно преобразуется в T иногда?

Вы можете сделать это, если T имеет конструктор копирования.

T a();

этот звук больше похож на объявление функции "a", возвращающее тип T