Инициализатор агрегатов
int a[] = {1, 2, 3}; struct point { float x, y; }
point p = {1, 2};
Не работает, если есть хотя бы 1 конструктор
До c++11
вектор (например) нельзя было инициализировать {...}
В c++11
появился конструктор
vector(std::initializer_list<T>);
{...}
не имеют типа, они не являются std::initializer_list<T>
, элементы {...}
могут быть вообще разного типа
Просто компилятор наблюдая {...}
в коде вызывает конструктор от std::initializer_list<T>
void f(int) &f //type = void (*)(int)
void f(int); void f(float); &f //не имеет никакого типа
auto
в таком случае не будет работать, но для IL он будет работать, если все его аргументы имеют один тип (просто в auto
костыль стоит)
f(vectot<int> {1, 2, 3});
new vector<int> {1,2,3}; //Создали и сразу проинициализировали
Инициализация работает не так радужно, как кажется
new int; //Не инициализированно new int(); //Инициализированно 0
struct point { float x, y; } new point; //Не инициализированно new point(); //Инициализированно 0
Виды инициализации
default initialization int a; new int;
value initialization f(int()); new int(); mytype::mytype() : x() {};
copy initialization int a = f();
direct initialization mytype a(1, 2, 3); f(mytype(1, 2 ,3)); new mytype(1, 2, 3); ... : x(1, 2, 3);
И вот в c++11
захотели сделать единый синтаксис для инициализации
list initialization
copy list initialization
mypyte x = {1, 2, 3};
direct list initialization
mytype x{1,2,3};
При этом f(int{}), new int{}
и т.д. это value initialization
, т.е разница идет в 0
аргументов и не 0
auto x = {1, 2, 3}; //В initializer_list<T> (т.е должны иметь 1 тип, иначе ошибка)
auto y{1, 2, 3}; //Если 1 аргумент - в этот тип, иначе ошибка
int a alignas(16); //Выравнивание (последние 4 бита нули)
--forceinline void f() {} //Microsoft void f() attribute ((always_inline)) {} //GCC
Атрибуты - советы, можно проигнорить этот совет и ничего не сломается
Unused, noreturn, duplicated
void f() [[gnu::always_inline]] {} //c++11 атрибут