Skip to content

Latest commit

 

History

History
84 lines (73 loc) · 13.5 KB

Lecture 17.md

File metadata and controls

84 lines (73 loc) · 13.5 KB


Uniform initialization

Инициализатор агрегатов

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 аргумент - в этот тип, иначе ошибка 

Generalized Attributes

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 атрибут