Лекция по стандарту C++ S-class, посвящённая особенностям инициализации переменных и агрегатов, с разбором примеров и статических анализаторов.
Ask about this video. Answers come from its transcript only — with the timestamp, so you can check them.
Generated from the transcript and can be wrong — check the timestamp.
Key Takeaways
- Инициализация в C++ S-class имеет свои подводные камни, которые вызывают ошибки компиляции.
- Важно понимать разницу между объявлением функции и инициализацией переменной с круглыми скобками.
- В языке C инициализация агрегатов (массивов и структур) происходит с помощью фигурных скобок и имеет свои правила.
- Статические анализаторы помогают выявлять ошибки инициализации, и их сравнение полезно для разработчиков.
- Методика обучения инициализации должна быть системной, чтобы избежать травматичного опыта и непонимания.
What the video covers
- Введение в тему инициализации в стандарте C++ S-class и её сложности.
- Разбор примеров инициализации переменных типа int и объяснение ошибок компиляции.
- Обсуждение подходов к инициализации и критика распространённых гайдлайнов.
- История личного опыта лектора с вопросами по инициализации на собеседованиях.
- Сравнение инициализации в языке C и C++, особенности и ограничения.
- Подробный разбор инициализации массивов и структур в языке C.
- Объяснение синтаксиса инициализации и его ограничений в контексте присвоения.
- Анонс битвы статических анализаторов clang-tidy и PVS-Studio.
- Пояснение, как пропущенные элементы инициализируются значениями по умолчанию в C.
- Обсуждение методологии преподавания инициализации и её влияния на понимание.
Chapters
- 00:00Введение и постановка темы инициализации в C++ S-class
- 05:34Битва статических анализаторов: clang-tidy и PVS-Studio
- 11:13Инициализация в языке C: переменные, массивы и структуры
- 16:50Особенности инициализации массивов структур и вложенных структур
- 23:29Правила инициализации и значение пропущенных элементов
- 27:30Ограничения синтаксиса инициализации и присвоения
- 36:40Обсуждение методологии обучения инициализации и личный опыт лектора
Full Transcript — Download SRT & Markdown
Speaker A
Всем здравствуйте! Это очередная лекция, посвящённая углубленному изучению стандарта C++ S-class. Мы наконец-то нашли возможность снять её, с некоторыми приключениями. Она должна была быть записана ещё до нового года, я обещал уже довольно давно, и вот наконец она. И сегодня мы
Speaker A
поговорим в основном про инициализацию. Сейчас поставьте видео на паузу, проверьте себя. Вот сразу, сразу поставьте видео на паузу и проверьте себя: все эти переменные — переменная A, переменная B, переменная C, переменная D и E — это int и инициализированы в ноль, да
Speaker A
или нет? И мне и сын гитаре... Я надеюсь, вы поставили на паузу сейчас, своё отжили внизу, де торе и отвечают: нет. Почему нет? Что не так? Нулём этого или инициализация нулём? Тут всё хорошо: int A и фигурные скобки пустые,
Speaker A
то есть 0, youth, и круглые скобки пустые. Вот для D пример — это тоже не то, что не так. А для B спрашивает Саша, верно? А для B, КБ, что такое B? Давайте посмотрим на год Балтин. Я всегда люблю спрашивать о том, что такое бегут болт, а
Speaker A
и так B. Давайте скажем, что вот у нас есть int A, int C, D — всё хорошо. Мы A инициализируем, B — цыпсы пресса медяницы, а потом мы присваиваем B единицу, и у нас резко ломается компиляция. Почему она ломается? Компиляция ломается, потому что ноль — объект,
Speaker A
то есть не объект, а что-то непонятное, чему пытаемся присвоить единицу, чему пытаемся присвоить int в данном случае? Конечно, мы пытаемся присвоить функции, потому что запись вот здесь — это, конечно же, объявление функции, а всё остальное — это определение переменных.
Speaker A
И в том числе вот это определение переменной int, просто круглые скобки — это int, int инициализированная нулём. И уже этот простой пример, а на него, конечно, все сразу ответили. Уже этот простой пример показывает, что с инициализацией в C++ связаны небольшие трудности, небольшие, но связно. Как обычно люди разговаривают про это, то есть как обычно люди разговаривают про инициализацию C++ S-class. Сначала вам приводят такого рода пример, и когда мы достаточно испугались, а можно привести ещё больше примеров? Бия, я
Speaker A
сегодня приведу ещё больше примеров, вы ещё больше испугаетесь. При правильно подобранных примерах, и когда мы уже достаточно испугались, вам предлагают безумный гайдлайн или серию гайдлайнов, как вы должны себя вести, чтобы, конечно же, избегать всех проблем с
Speaker A
инициализацией. Замечательно! Выступление я сию this очень рекомендую, я много из него почерпнула. К сожалению, если сделает именно так: сначала пугает примерами, потом предлагает гайдлайн. И причём гайдлайн предлагаемый есть в виде сам, он выглядит фантастически, он предлагает всегда теперь писать цикл и
Speaker A
вот так, то есть никакого больше и равно нулю, все инициализируют фигурными скобками. Advair немножко полемизирует с GS, я сьюзи сам, но строят настроить свою статью на абсолютно том же принципе: он пугает примерами, потом он предлагает гайдлайн. И мне кажется, вот этот подход
Speaker A
методологически порочным, потому что что после такого подхода остаётся в голове у человека? В голове у человека остаётся один или два пугающих примера, обычно те, которые его более всего напугали, которыми он пугает на собеседованиях людей, как от которых он приходит
Speaker A
собеседовать. И у него остаётся в голове два или три гайдлайна, которым он всё равно не следует и чувствует из-за этого внутренний спрятанный стыд. Не может наследовать, николь бер мальчик не будет следовать вот этому гайдлайну из цикла. Ты в итоге у
Speaker A
человека получается травматичный опыт инициализации. И у меня у самого была своего рода травматичная по централизации, потому что я однажды совсем, кстати, недавно, меньше года назад пришёл просто по собеседоваться, но не потому что хотел менять работу, потому что не хочу терять навыки собеседования.
Speaker A
В одну замечательную компанию меня там спросили про инициализацию, я сходу не смог ответить, то есть я потом отыгрался на других вопросах, но то, что меня завалили possible as close, я воспринимаю как серьёзный пробел. И я понял, что необходимо систематизировать собственные
Speaker A
знания про инициализацию. Я последние полгода это делал, и сейчас я наконец дошёл до той стадии, когда я систематизировал в той степени, что я, пожалуй, могу что-то рассказать людям и рассказать людям, откуда действительно растут проблемы с инициализацией в
Speaker A
C++ S-class. И такие ли уж это большие проблемы? На самом деле они не такие уж большие. Кроме того, сегодня нас ждёт... Меня упрекают, что я обычно устраиваю битву компиляторов, там кто прав: clang, clang++, gcc. Сегодня нас ждёт битва статических
Speaker A
анализаторов. Блага на год балки. У нас теперь целых два статических анализатора. Раньше был только clang-tidy, теперь кроме clang-tidy у нас может быть ещё PVS-Studio. И поэтому я очень благодарен ребятам за то, что они на год болт пришли, и мы сегодня
Speaker A
устроим эту битву. Я ещё верну эту чашку в кадр, когда мы это будем делать. Следите и следите за ходом лекции. Итак, поехали! Начнём издалека. Начнём с языка C. В языке C инициализация обычных переменных обычно там просто int и равно 0, и всё, это всё,
Speaker A
что вы можете сделать. Интересные инициализации агрегатов в языке C — два вида агрегатов: это массивы и структуры. Оба вида агрегатов инициализируются похожим образом. Извиняюсь, оба вида агрегатов инициализируются похожим образом. Например, если у вас есть массив и вы инициализируете, вы пишете фигурные
Speaker A
скобки. Внутри фигурных скобок перечень элементов того типа, которого у вас массив, или другого типа, он приведёт их. А когда вы инициализируете структуру, вы пишете перечень каких-то инициализаторов для структуры. Когда вы инициализируете массив структур, вы открываете фигурные скобки один раз для
Speaker A
массива, каждый раз вы открываете вложенные фигурные скобки для каждой структуры, которые входят в массив. Что если у вас есть структура, в которой входит массив структур, и вы хотите инициализировать массив таких структур на языке C? И всё просто: вы открываете
Speaker A
довольно много фигурных скобок. Попробуйте, кстати, вот опять на секундочку притормозите видео. Ошибся я здесь или нет? То есть вот это окей, я правильно инициализирую массив структур. И уже на этом простом примере правильный ответ, конечно, не убей, потому что как минимум это массив
Speaker A
структур, это массив структур, каждый из которых содержит массив структур. То есть вы начали должны открывать 4 фигурные скобки, а в нём вначале открываются 3, правильно? Вот. Но предположим, я добавлю здесь ещё одни фигурные скобки, тогда чему будет равно tor 0x1 и горя к чему
Speaker A
будет равно tor 0x4 дек и tor 0x1 игрек? Проследить довольно легко, а вот tor 0x4y проследить немножко сложнее. До таратар 0x1 игрек — это что-то вроде 4, потому что это x1, а что такое x4.y? Вот и здесь
Speaker A
пропущено ещё три элемента, потому что у нас массив из 5 структур в данном случае. И поскольку здесь пропущено ещё три элемента, но мы что-то инициализируем, то они инициализируются в дефолтное, значит, то есть в языке C всё, если вы не
Speaker A
инициализируете, у вас ничего не инициализируется. Если вы инициализируете, у вас инициализируется всё, всё, что вы пропустили в инициализаторе, и как в данном случае инициализируется в дефолтное значение. И соответственно, если я добавлю фигурные скобки здесь и здесь, те, которые нужно добавить, чтобы всё
Speaker A
заработало, помечена синим, у вас всё заработает до некоторой степени. Язык C тянется слишком хорошо, то есть в языке C возможно структуру, возможно массивы и любые комбинации: массивы структур, массивов структур, массива в структуру, массивов — всё это ещё замешано густо с
Speaker A
различными элементами. И для всего этого есть только один синтаксис инициализации. Причём обратите внимание, вот этот синтаксис — это синтаксис именно инициализации. Вы не можете использовать вот это выражение для B, например, в контексте присвоения. Вот вы можете инициализировать так всё, если вы хотите
Speaker A
присваивать, уже там присваиваете поэлементно или присваиваете другому объекту той же структуры. То есть это довольно ограничивающий, он довольно простой и логичный, но довольно неудобный способ инициализировать вещи. И в языке с этим, конечно, боролись, и в частности главный способ, которым в языке C с этим
Speaker A
боролись, это дизельный тает мешал others. А соответственно, конечно, если у нас есть вскоре сколько сколь-нибудь...
Speaker A
боролись это дизельный тает мешал others а соответственно конечно если у нас есть вскоре сколько сколь-нибудь сложная система то написать вот здесь какое-нибудь разумный инициализатор ну попробуйте на досуге да но попробуйте напишите для цветов говорить разумный инициализатор но а для того чтобы облегчить
Speaker A
инициализацию хотя бы просто структуры а мы вводим дизель made it инициализатор и для структуры и и сигналит инициализатор и для массива опять-таки это язык сего все знают я не буду долго останавливаться что здесь написано мы говорим мы инициализируем структуру а мы
Speaker A
хотим инициализировать поле x в четверку мы хотим мы хотим оставить y по умолчанию то есть инициализирован им но инициализирован по умолчанию то есть нулем и мы хотим инициализировать массив z как мы хотим а инициализировать массив z мы хотим
Speaker A
оставить у него все элементы по умолчанию то есть нулями кроме второго элемента и 3 элемента второй элемент массива z мы хотим сделать пятеркой на самом деле 3 потому что мы считаем с нуля но это элемент с индексом 2 мы
Speaker A
хотим сделать пятерка элемент с индексом 3 мы хотим сделать шестеркой клево и в мы хотим пропустить то есть оставить таким какое оно и было аналогично если мы будем анализировать структуру бета мы можем написать . дата равно и написать и зеленеет это миша
Speaker A
лазер для структуры и так далее земля это это ниша лазер на удивление плохо прижились языке тепла в класс они собственно все класс класс вошли только вот сейчас только в 20 standart проник в сип лаз пласт проползал который ввёл нам только desided это ниша лазеры
Speaker A
для структур и только в агрегатной инициализации диагно эта ниша лазеров для массивов у нас до сих пор нет это будут и расширение там где она вообще есть и дальше конечно . exit 4 а точки велико это 0 и это не мусор мы
Speaker A
инициализировали значит мы инициализировали и это все язык си приятно прост по сути в языке си есть три способа инициализировать вещи мы можем написать type valve равную ниша лазер это ну то-то что в языке си класс пласта нет директ и не цели за решил копи
Speaker A
инициализация агрегат инициализация для массивов и структур либо мы можем инициализировать по умолчанию например яндекс 5 вы их intex это в локальном scorpian define если же это в глобальном скупит это все нули и наконец мы можем инициализировать в данном случае массив
Speaker A
тоже нулями мы пишем 100 догадывается что все остальные нули как я уже сказал если мы напишем одну единицу вот здесь одну единицу он не догадается что все остальные единиц и он точно так же догадается что все остальные нули
Speaker A
в некотором смысле он имеет догадываться то когда одной вещи и поскольку в языке си любой объект это просто область памяти то есть у объектов есть состояние но нет поведения этого хватает разумеется в сипло сплав все немножко сложнее но давайте запомним
Speaker A
и так из языка си у нас есть 3 базовых вещи первая инициализация второе соглашение о том что если мы начали что-то инициализировать то у нас все инициализирован 3 а возможность делать инициализацию по умолчанию которая не делает ничего то есть возможность
Speaker A
оставлять переменные неинициализированных это критичная возможность например если у вас есть так то понятное дело что если бы у вас было инициализация по умолчанию нулями то каждый объект на этом стыке вы потратили время на запись туда нулей 0 и
Speaker A
0 июле юлей столько раз сколько вы создали этот такой фрейм на вызове вызове вызове вы завели за ваши функции оставлять что-то не инициализирован им или как говорится дефолт инициализирована дефолт инициализирована очень часто означает мне инициализировать это тоже очень и очень
Speaker A
хорошо и это то что мы унаследовали си мы унаследовали концепцию агрегата мы унаследовали клёвую инициализацию через равно и мы унаследовали возможность оставлять вещи не инициализировал as теперь какую самую главную вещь принес тепла сплошь в девяносто восьмом году по сравнению с языком си и конечно
Speaker A
это классы правильно то есть все пласт класс нам нужны конструкторы однако причем поговорим о конструкторах давайте еще немножко языке смотрите язык си очень простой язык любой объект это просто область памяти и поскольку любой объект это просто область памяти
Speaker A
мы в общем более-менее можем в любую из памяти за писатель будет подходящая значит поэтому язык си особенно не париться с типами то есть если вот у нас есть чар и мы записываем туда чар ok атака если мы складываем charts in там
Speaker A
то результат у нас проводится dream там тем менее тот int мы берем записываем обратно в чар и это тоже ok хотя это вашему в общем случае сужающие преобразование потому что здесь мы могли переполнится и так далее но и закуси на
Speaker A
это пофиг дальше мы берем 7 с половиной и записываем минут он обрежет а мало того язык си при инициализации и это тоже нам досталось и звезды пасе делает викинг а я называю это деградирующие преобразование потому что слово детей означает деградировать
Speaker A
авторский термин я не уверен и и распространенности в русскоязычного даже комьюнити класс пласт а это в общем то обычный им плэсид converge и на то что в стандарте от называется implies convictions это i'm pleased конверт шанс array тупой
Speaker A
интернет ли скан вершин function тупо enter in place конвершн отца в эту not то о чем мы много говорили когда мы говорили о перегрузках и язык кассе позволяет очень-очень-очень уволена работать с указателями вот у нас был констант указатель вот у нас int
Speaker A
указатель это в общем просто вор нитку то есть в отличие от тепла сплав где-то полноценная ошибка где так вообще нельзя делать и записи этого любой указатель в любой указатель кому потому что почему потому что ну а в языке си программист всегда может
Speaker A
написать волшебные круглые скобочки и при и принудить компилятор к чему угодно и поскольку компилятор в общем знает что его приведет к чему угодно он не рыпается по мелочам кроме того последнее чего нам очень сильно не хватало в языке си не хватало в языке си
Speaker A
того что инициализации касается только переменах в языке си мы не можем написать вот так вот и мы не можем взять вот такой своп полей то есть если мы хотим сделать вот эту структуру из вот этой просто обменяв местами y и x
Speaker A
мы не можем написать ли turn с y и секс или или или мы не можем вызвать функцию фу и передать туда 12 вот визы кисет его нельзя сделать в языке си инициализация это только инициализация она возможна только в контексте
Speaker A
инициализации ограничено синтаксические всем-всем что я только что показал и выучив все эти прогулов и более-менее знаете об инициализации в языке си все есть тонкости есть инициализация не именованных полей в структурах есть специализация битовых полей есть union и есть случаи когда впадинка пишется 0 и
Speaker A
есть случай когда впадинка ничего не пишется это все можно за недельку выучить после чего в рамках язык россии вы становитесь непобедимыми человеком то есть у вас нельзя завалить а когда вы все это знаете в седла спалось такое вряд ли возможно я сразу предупреждаю
Speaker A
даже после этой лекции я не обещаю вам непобедимость и так тепла сплошь и первое что вы носит сипло сплошь это конструктор конструктор это что-то вроде статической функции самый простой способ думать о конструктор как мы объясним им детям думать о них как о статических функциях
Speaker A
и когда мы вызываем конструктор мы используем и тогда это казалось логично а в 98 их плюсах по крайней мере мы используем функцию подобные синтаксиса у нас есть объект мы делаем круглые скобки передаем аргументы у нас есть иуд но им ты тоже тоже объект а почему
Speaker A
мне так нельзя и конечно же в unde тоже сделали что так можно как говорит страуструп ваши классы это ваши типы они такие же настоящие типы как int и флот почему-то int и float считается как это почему-то int и float считается эталоном настоящей
Speaker A
стянут если ваш тип ведет себя как инст это настоящий тип вот и мало того если мы разрешили это для именованных объектов почему не разрешим это длиннее именованных объектов и люди разрешили это для не именованных объектов ну и в
Speaker A
самом начале лекции мы видели что это привело к тому что теперь всех можно испугать а вот такой синтаксис когда у нас есть конструктор и в нем прямо указывается чем мы инициализируем или когда у нас вот так есть или когда у нас
Speaker A
и так есть то же самое для временного объекта это называется прямая инициализация синтаксическая категория в стандарте мы сейчас поговорим о стандарте посмотрим всякие цитаты из него директ инициализации и уже это приводит к странным последствиям потому что если мы пишем вот так int и
Speaker A
и пытаемся инициализировать его 1 , 2 то это ошибка потому что неправильное количество параметров для директа не цивилизация а когда мы инициализируем с помощью копии инициализация то у нас возникает замечательная синтаксическая неоднозначность у нас есть оператор , и
Speaker A
данном случае работает оператор , и конечно после такой инициализации i будет равно 2а что тоже смешно vod-ok тем менее это мелочи то есть ладно ладно хорошо у нас есть оператор , но гораздо хуже что мы разбирали в самом начале у
Speaker A
нас есть мост весь импорт и мост fixing парс эта проблема над которую каждый наступал и проблема которая связана с тем что у нас есть в данном случае lst и мы не очень хорошо понимаешь такое lst потому что в данном случае lst по виду своей
Speaker A
записи чисто синтаксически подходит как на определение объекта инициализирована во из двух итератора в данном случае так и на объявление функции объявление функции которая берет вот что то такое типа него функций вот и нет вот это объект вот это объект вот
Speaker A
такого типа потому что на вокруг объекта можем поставить скобки а вот это что-то вроде указателя на функцию которая возвращает из 3 мотора таргет и для того чтобы решать такие синтаксические неоднозначности в языки сипло с плохие железное правило его тоже
Speaker A
все знают железное правило если что-то похоже на объявление функции это объявление функции . это записано в стандарте именно такими словами то есть это не упрощение это прям цитата в до целом беглец записано и не конструкция тут possibly be
Speaker A
declaration declaration все все все что теоретически может по грамматике быть сочтено определением это определение и до сих вас plaza лаван мы решали эту проблему если вы все-таки не хотим такую функцию если мы все-таки хотим такой переменным мы решали это ставя
Speaker A
дополнительные скобки исключая синтаксическую возможность для этого быть объявлениям соответственно ужасно отвратительно очень хрупка при первом чтении вообще не понятно что хотел сказать автор этими скобками и конечно все всегда хотели от этого избавиться и в 2011 году к нам пришли единороги вот
Speaker A
вы видите тень единорога на экране возможности инициализации объекта с помощью фигурных скобок обратите внимание это тени оно похоже на фигурную скобку вот этот вот рог у фигурной скобки которые и не форм инициализация он похож на рог единорога бегущего вперед или назад в зависимости
Speaker A
от того открывающая скобка и закрывающая поэтому unipharm инициализация мы также называем юникорн инициализации то довольно распространенный термин его можно часто встретить в интернете его можно часто встретить на всяких конференциях и теперь wow and и точно не объявление функции
Speaker A
если бы это была если бы это было объявление функции здесь были бы круглые скобки не так ли мы можем заменить пятерку отлично мы можем заменить вот эту штуку все хорошо теперь last это точно и заточные объявление функции работает для любых
Speaker A
пользовательских объектов у нас есть структуру с двумя винтами я не смотря на то что тут скобки круглые здесь они фигурные потому что любая инициализации это что-то вроде фигурных скобок это была прекрасная идея люди сказали давайте давайте сделаем давайте сделаем потому что осмотрите о
Speaker A
музыке сижу было инициализация фигурными скобками ну там же не будем будем цивилизация кругу было инициализация фигурными идея восхитительно мало там люди на этом не остановились люди сказали у нас есть больше восхитительных идей раз уж у нас есть новый синтаксис инициализации и раз уж
Speaker A
мы оставили старые чисто для совместимости давайте сделаем новый еще лучше например давайте заменим давайте запретим на роуминг народных каст давайте запретим шоу сужающие преобразовать давайте скажем что вот это будет ошибкой компиляции и сказали и это правда ошибку компиляции а вот это окей но непонятно в
Speaker A
инициализируется двойкой все-таки троек я думаю двойкой вот а вот эта ошибка и всем сразу все понятно программе что-то перепутал а мало того целью инициализация это новый термин я вот все вот эти термины буду вводить и уже ввожу по
Speaker A
одному вот мы уже выучили директор инициализации 1 инициализации выльем соли зация это новая вещь языке си ничего такого не было на самом деле в стандарте закрась и вообще не прописаны все эти типа инициализации в стандарте запасе прописано type равно их спрошены все вот а в
Speaker A
стандарте сипло спас как раз введены вот эти семантические категории и вылью инициализация это инициализация значением по умолчанию если вы не написали просто им джей джей осталось бы ни инициализирована а если вы да мы написали ынджи и дальше фигурные скобки то джеймса лизе руется
Speaker A
значению помог and i типа int то есть нулю точно аналогично также здесь аналогично также здесь обратите внимание мы выделили в динамической памяти массив и весь его инициализировали 0 вал благодаря юникорн инициализации мы смогли инициализировать в любом контексте в
Speaker A
любом контексте в до цели нет в стандарте сипло снова столько написано процесс инициализации относится к а а в ко всем инициализация независимо от синтаксического контекста включая инициализацию параметра функции инициализации возвращаемого значения или даже тот случай когда у нас правда
Speaker A
происходит инициализация и ниша лазер волос declared пор очень нравится что он перечислил последним ада чуть не забыт и или в случае когда я решила whirlpool aws declared a и это означает что у нас нет разницы мы можем вернуть мы можем
Speaker A
инициализировать мы можем передать у нас появилась куча новых классных возможностей это фундаментально инициализация в любых контекстах однако куча новых классных возможностей иногда тает кучу новых классных возможности ошибиться опять-таки очень простой вопрос я уверен вы знаете на него ответ поставьте сейчас видео на
Speaker A
паузу ответьте мне на него в чем разница между вот этими двумя векторами кто-нибудь ответьте мне у него в аудитории фигурные скобочки снизу это ниша лазер лист даже в 20 до между и относительным правильный ответ между этими векторами разница в длине почему потому что вот
Speaker A
это вектор из трех четверок это вектор 444 а вот этот вектор из двух элементов 34 потому что когда затаскивали июне формами цель излишен затащили еще одну очень важную вещь затащили возможность инициализировать виктора и вообще не вы пользовательские классы также удобно
Speaker A
как в языке инициализируются агрегаты а то раньше но представьте вы перепишите stood вектор так и вы хотите написать этом уступ вектору инициализатор там с 60 элементов но вы не можете этого сделать а теперь можете благодаря тому что в тепла с
Speaker A
классовым ввели ниша лазер лист и если есть конструктора ты ниша лазер лист то всегда сначала пробуется конструктор это ниша лазер лист вот эта списочная инициализация это директ инициализация если конструктора таниша лазер лист нету либо этот директ лист инициализация если
Speaker A
конструктор это ниша лазер лист есть вернее не так синтаксически это всегда a direct лист инициализация просто она распадается на два случая и поскольку у вектора есть два конфликтующих конструктора один отца эстель и в илью которая в данном случае бац и совпало с anthem а
Speaker A
второе это ниша лазером листа то здесь будет вызван один конструктор здесь будет вызван другой конструктор а это неудобно но это не слишком пугающий пример в том смысле ну вы один раз на это наступили и такой ну ладно ну ну ну
Speaker A
ну ладно если есть конструкторы тоньше лазер листа я запомню что если фигурные скобки то это конструктора тамиша лазер листа но тоби где и объектв туда ниша лазер лист довольно интересная штука потому что study ниша лазер лист это с одной стороны библиотечный класс а
Speaker A
с другой стороны он прибит к стандарту гвоздями например и миша лазер лист может быть выведен выводам и в этом случае мы говорим что если у нас есть а вот этот x и one а то и у нас выводится
Speaker A
вот из этой штуки ниша лазер list the standard говорит если мы сделали вот так но не включили хедер ниша лазер лист тогда программу форм эта ошибка компиляции в это невозможно поверить действительно так то есть речь идет о следующем когда
Speaker A
вы делаете что-то что может повлечь появления в вашей программе типа чем-то похожего на ниша лазер лист если вы не включили если вы не включили федор то он говорит студень эйша лазер лист воздух found говорит я не могу дьюсид type
Speaker A
потому что вы не включили хедер вау опять таки это ну да белье ну типа опять и опять легко запомнить каждый раз когда мы делаем в языке хоть что-то лучше делать им клуб вектор потому что этот вектор включает ниша лазерные стажа векторного все равно
Speaker A
пригодится все равно все делают young nude вектор в любых достаточно крупных проектах ну вот и заменить замечательная идея будем будем делать так всегда до 100 dfx утишить это за аудитория на конечном пункте dfx а вот теперь перейдем к более профессиональном более
Speaker A
профессиональном вопросу поставьте видео на паузу и тот заставит вас задуматься одинаковые ли размер имеют эти вектора да конечно увести у вектор же есть конструктор и вектора есть конструктор от сколько и чего не так ли то есть как минимум это может быть
Speaker A
вектор из сорока двух строк каждый из которых с а вот это типа вектор из 42 чаров каждый из которых c разве не так выглядит так но дело в том что все пластмассовом ввели также const экспорт и const экспорт позволили вычислять
Speaker A
является ли преобразование сужающих и в данном случае в данном случае contex пор вычисляет по стандарту а в стандарте кстати очень клевая формулировка давайте я ее сейчас найду потому что она заслуживает того чтобы ее найти экспресс шанс констант экспресс 14 голос
Speaker A
это еще ниже вот здесь написано expression is потенциале константы в ли этот почему 14 да вот 14 клаус 82 примечание что сейчас вот что конце и expressing а окон вершины с потенцией ли константа воле этот если это 14.3
Speaker A
immediate сам expression of brest и нет лист и в случае если это и медиа сам expression of brest и нетлист тут есть сноска которая говорит конским ты выльешь на мои be necessary to determine whether in neru and converter is
Speaker A
performed то есть чтобы определить является ли преобразование нору young компилятор может в complete ign это оценить с помощью констеблей и в данном случае происходит именно это если вы попробуете на вся сердце 42 у вас произойдет все хорошо потому что 42 это
Speaker A
нормально и он эмулируется в компл time как правильный чар а если вы попытаетесь написать черта 1024 то у вас будет все очень плохо потому что компилятор поймёт что это сужающие преобразование ну разумеется если компилятор не может в компонентом
Speaker A
понять сужающие она лине сужающие например если вы получили чар как аргумент функции подставили просто суда как c + 1 это компилятор выдаст и что это сужающие преобразования в любом случае вот но что это означает это означает что вот эта чар и это означает
Speaker A
что вот этот вектор имеет размер 2 а вот этот вектор имеет размер 42 потому что в этот string и вот это конструктор из инша лазер листа а это вызов конструктор 42 где здесь а что будь это очень хороший вопрос
Speaker A
спасибо вопрос из аудитории был такой а что если я напишу здесь статика каст и мп и 42 правильно так вот по стандарту x x 42 ция раскрывается как он сейчас а два это чарт 40 было сердце 4 говорят
Speaker A
и просто неправильно надо менять такой стандарт мы может быть вот но опять-таки над обидно но таких дел мы мы просто запоминаем я почему стоит вопрос для профессионала вот вот на этом уже можно срезать человека так что он не обидится что вы
Speaker A
его на детских вопросов срезаете вот главное главное чтоб стол был пошире чтобы мне возьмутся через тот как бы броситься вас душить а здесь мы говорим что мы запомнили что если даже тут что-то выглядит не как чар она может оказаться чарам джастин кейс
Speaker A
просто потому что в языке есть контент в лично пока что нам нужно не так много помнить я имею в виду в языке си правило когда padding на улице когда он не ну лица пожалуй даже сложнее но это мы
Speaker A
просто еще этом мы просто еще не все посмотрели мы пока что все опять таки логично но согласитесь логично отделять народных преобразованиях не на роулинг на этапе компиляции просто почему что я вчера почему вопрос почему считает что мы должны кастовать
Speaker A
котяру они контур а дело в том что он так считаю потому что здесь этот вектор чар уступ вектор чар есть конструктор от и ниша лазер листать чар и он пытается пытается всеми силами первой строчкой смочить конструктора ты миша лазер лист от чар
Speaker A
а все что он сможет загнать в конструктор от ниша лазер лист любыми силами он в него в тащит все остальное не втащит а замечательно теперь еще один маленький вопросик для новичка рассмотрим простую структуру с двумя конструкторами это вопрос на тему того является ли
Speaker A
униформа инициализация такой уж uniform у нас есть просто конструктор по умолчанию у нас есть конструктор отвечал азер листа мы можем вызвать конструктор по умолчанию мы можем вызвать конструктор от леша лазер листа но это конструктор эта ниша лазер листа вы не
Speaker A
внутренней ш лазер листа чтобы его засчитали замешал озер лис должно что-то быть правильно в данном случае мы поставили внутрь это вы ниша лазер листа верный инициализирован эй int то есть грубо говоря мы поставили внутреннего 0 это и ниша лазер лист размера 1
Speaker A
но вообще в мире бывают пусты и списке инициализации как сконструировать объект б от пустого списка инициализации а дима предлагает написать равно можно еще варианты а если директной инициализацией есть красивый вариант я надеюсь вы сейчас поставили на паузу и
Speaker A
подумали красивый вариант заменить внешние скобки на круглые дело в том что если ему не удается смочить конструктор от списка инициализации сын он начинает мочить все остальные конструкторы в том числе конструктора списка инициализации но уже обычной перегрузкой таким образом это очень
Speaker A
важно это очень важно потому что это фундаментальная вещь он так делает более менее всегда а в данном случае в данном случае он смог смочить конструктор от списка инициализации это конструктор от списка инициализации внутри которого стоит в или инициализирован и int и здесь вот
Speaker A
здесь у меня будет со дефолт котор а здесь у меня выводится или ск тор и л л . says и вот здесь у меня выводится и лист кто один видите вот здесь вот или скоро 1 а вот здесь этот синтаксис не является
Speaker A
синтаксиса конструктор от списка инициализации это просто вызов какого-то конструктора он берет перегрузку всех конструкторов а здесь их благо всего два какой из них больше всего подходят больше всего подходит тот который от списке инициализации потому что вот это на что это больше всего похоже это
Speaker A
больше всего похоже на список инициализации таким образом он конструирует x от списка инициализации размером 0 и это ещё одна очень важная вещь чтобы ее запомнить когда может он берет конструктор от списка инициализации но если он не смог он может ему все равно
Speaker A
возьмет ну просто поток на общих основаниях то есть конструктор от списка инициализации может выиграть два раза один раз он может выиграть потому что он предметы языку властями а второй раз он может выиграть в общее гонки то есть он
Speaker A
сначала бежит 1 а потом бежит в общем зачете в данном случае он выигрывает в общем зачете превосходно пока что все еще просто и логично в конце концов у нас есть общий зачет у нас есть вернул один конструкторов на прошлый раз
Speaker A
говорили про умерла денег у нас есть спец семантика для списков инициализации вот пожалуйста 5 семантика для списка инициализации всегда спят семантика для списков инициализации я не могу удержаться извините я еще я еще посвящу пару минут спец семантики для
Speaker A
списков инициализации скобочки скобочки мы все любим скобочки не так ли а смотрите вот у нас структура x то же самое вы только что видели это в год balti только теперь мы немножко развлекаемся вот эти три варианта вы уже видели
Speaker A
теперь я добавляю 4 вариант я добавляю 4 вариант d в которым я делаю еще больше скобочек больше вложенных скобочек и если я добавлю еще одну пару скобочек я получу ошибку компиляции но если я добавляю 3 пары вложенных скобочек то на экране все
Speaker A
еще и лист кто родил с тремя все понятно конечно что понятно с тремя да он идет в общей выигрывает конечно а этот абсолютно то же самое он конструируют из вот этого а вот эту на что похоже это похоже у нас тут миша
Speaker A
лазер лист то есть на самом деле у нас именно смотрите мы начинали с полностью логичных правил но после того как мы рассмотрели полностью логично и правило у нас получилось странная 7 3 вот это разные вещи а вот это одно и то же
Speaker A
почему потому что вот это может выиграть как и миша лазер лист а вот из этих никто не может выиграть как и ниша лазер лист и они выигрывают на общих основаниях и разумеется если мы добавим еще одну пару скобочек то мы получим
Speaker A
ошибку компиляции тумане braces он так и говорить тумане brace тумане brace из и раунда ниша лазер в тумане brace что что мы не брейся сетах и именно поэтому тут вектор можно инициализировать двумя способами stood вектор можно инициализировать и ниша
Speaker A
лазер листом как мы это обычно делаем нос тот вектор можно инициализировать и ниши лазер листом вот так потому что в этом случае мы вызываем обычный конструктор фигурные скобки поскольку этой униформы инициализации в этом смысл в этом смысл их виде наружности
Speaker A
смысл их иди народности как раз в том что мы можем и так и так мы можем считать их как спец семантика можем считать их как и не форм реализации класс а как вы думаете 55 потягивали ему пять выдержим ли мы 5 поставьте видео
Speaker A
поставьте видео на youtube и на паузу я не приведу ответ на этот вопрос но я подскажу выдержим 5 выиграли 5 соответственно запустите ответ в комменты как вы думаете почему мы 5 выдержку и так небольшой промежуточный итог хищная инициализация была прекрасна но
Speaker A
нам нужны были конструктор конструктор породили некоторые проблемы их было легко спутать с объявлениями их сложно использовать произвольном контексте например представьте return а потом выражение в скобках но если return и потом выражение в скобках то это просто какое-то выражение с кому оператором
Speaker A
внутри правильно поэтому пришли фигурные скобки фигурные скобки пришли не одни фигурные скобки привели с собой списке инициализации для удобства инициализации библиотечных и пользовательских классов потому что везде кисти такая проблема просто не было там нет пользовательских классов языки сипло спас мы можем делать типы
Speaker A
столь же удобные как int и float и разумеется столь же именно к видел сценарий отлично а что еще интересного принес с собой сипло в полоса да какая еще киллер фича было всего спасла buff buff это классно ошибка срач если
Speaker A
цивилизации вывод типов out a sip вас по силовым принес с собой аута и конечно вывод типов добавляют огня а здесь у нас есть некоторые выбор мы можем из этого что-то вывести соре мы можем из этого что-то вывести можем вывести int потому что это
Speaker A
похоже на имп можем вывести ниши лазер лист потому что это похоже на если наша лазер лист до 2017 года это в обоих случаях было ниши лазер лист потом это починили в си плюс плюс 20 в dcl тайпа у тани до пд 4 клаус записано
Speaker A
для того чтобы соответственно получить пст давайте зайдем в стандарт потому что вот в этой цитате яда вернее не очень аккуратно подобрал немножко не понятно что такое поездка и т.д.
Speaker A
это dcl тайм-аута дидух 4 клаус доцент type болта и тогда цель tapout а вот значит где написано где написано что вот вот эта цитата которую которую я которую я взял как закрыть поиск так вот так ский а вот цитата которую я взял и
Speaker A
стандартам то есть смотрите что здесь написано если placeholder type спицы fire в форме так constraint out on a type constraint это что-то в виде танк он стал так он стал тариф вот это все тогда выведенный тип ты штрих
Speaker A
определяется по правилам моргун deduction но дальше написано очень важная вещь вы вот это самое п то есть я реальный тип получается ice-t заменой всех значит всех вхождений возможно как-то ограниченного аута либо с помощью нового тимплей параметр у если
Speaker A
инициализация такой пили станице аллюзий шин илем на либо с помощью либо если это копи лист инициализация с помощью суда ниша лазер не стату и вот это очень существенно это как раз означает что в данном случае в двадцатом стандарте вот здесь у меня нет
Speaker A
специального специально выделено если это копи лиственница лизой шин то есть если синтаксически вот здесь стоит равно дальше фигурные скобки вот это директриса инициализацию вот это копи лиственница лежишь если это купили специализация то это ниша лазер ли старту а если это директриса
Speaker A
инициализация то это просто обратите внимание аута при этом выводит тип пользуясь обычными правилами вывода типов из 42 в любом случае выведется int здесь он заменит его на и ниша лазер лист не потому что он плохой злой он заметил он лишь a loser лес потому что
Speaker A
требует нормативный документ и размер это мы можем это заблокировать просто указав здесь тип тогда немножко непонятно зачем мы здесь не писали able to do можно было бы дать такой гайдлайн но я обещал не давать гайдлайн of потому что я не is you this а к слову в этой
Speaker A
цитате должно быть одно слово которое может нас очень смущать на самом деле и это слово не выделено жир ну я полагаю в аудитории она никого не смущают я подскажу от слова in window я не знаю знает ли кто-нибудь из тех кто
Speaker A
смотрит это видео что компилятор может изобретать типа но тот факт что компилятор может изобретать типы это очень важный факт и буквально в следующей лекции мы к нему вернемся это критически важная вещь мы можем изобрести изобретать типы и так основная идея за вот этим анода и
Speaker A
да да соответственно 2017 обе выводили ниша лазер листа потом починили теперь вот это воет int этого этой нише лазер листа так почему это кажется нелогичным самом деле это очень логично у нас есть грубо говоря три случая которые похожи на дерек ты не залезешь и
Speaker A
когда мы делаем просто x равно 1 когда мы делаем x1 когда мы делаем энтот единиц и у нас есть три случая которые похожи на окопе инициализация когда мы делаем риту им когда мы делаем передачу параметров функцию и когда мы делаем x
Speaker A
равно и дальше фигурных скобках один конечно вот в этих двух случаях аута ничего не сможет вывести то есть если у нас есть функция которое возвращает out одну а вот здесь а у ты у нас вообще раньше не было теперь есть конечно но
Speaker A
тоже ничего не сможет вывести но понятное дело что вот эти три случая семантически совсем другая вещь то есть когда вы делаете вот это вы говорите что-то я вот прямо инициализирует значением 1 а когда вы делаете что типа вот этого вы говорите я копирую vx
Speaker A
значение и в данном случае все это значение но похоже на ниша лазер лист такое интуитивное объяснение просто чтобы легче понять а вот теперь мы вспоминаем про то что у нас есть не только конструктор потому что язык си совсем его наследием никуда не делся не
Speaker A
из языка си совсем его наследием у нас остались агрегаты и конечно мы не хотели бы терять возможность инициализировать агрегаты мало того раз уж мы разрешили делать это не только как языке си давайте разрешим это тоже делать по всякому и так и всякой наперекосяк
Speaker A
то здесь нет никакого конструктора но мы все равно можем инициализировать at the back потому что это агрегат и у него есть агрегатная инициализация можно подумать что здесь введенным плэсид конструкторы замешалась orlistat но это не так какого 10 конструктор означало
Speaker A
заблистать здесь нет здесь происходит совсем другая вещь здесь происходит агрегатном социализации молодого канализацию можно сломать например мы взяли и добавили виртуальный деструктор теперь ссоре сколько мне придется резать на монтаже это ужасно почему меня вот эта штука стала гиперчувствительной она никогда
Speaker A
такую nebula что вообще творится так так вот соответственно допустим мы добавили виртуальный деструктор и раз и это перестало работать потому что если у нас есть виртуальный деструктор заметьте ни каких пользователей конструкторов мы не добавляли если бы здесь было
Speaker A
увеличить конструктор этом и продолжила работать но нет потому что это больше не агрегат и даже если мы притворимся что мы пишем на языке си и делаем вот так скажем на мы хорошие возьмите нас обратно визы xenith чуть не произошло вы
Speaker A
добавили виртуальный деструктор все никакого большие за кассе и теперь интересно что такое агрегат потому что агрегат это совсем не то же самое но а а что что такое вот интуитивно что такое хищный тип интуитивно сильный тип это три велика
Speaker A
people и подумайте над но агрегат это совсем другая вещь агрегат это список из четырех запретов агрегат это не столько что-то сколько отсутствие чего-то например агрегатом являются с туда рэй агрегат формально по стандарту это класс без юзер declared конструкторов и ли ын хе ри тот
Speaker A
конструкторов без привык protect от но он static do the members то есть без приватных членов своих своих приватных членов без приватных или против that bass и также без виртуальных базовых классов виртуальных даже public нельзя и без виртуальных функций заметьте если
Speaker A
у вас есть публичная база в которой есть приватный член на член не у вас оон в публичной базе то вы все равно агрегат то есть вот агрегат это то в чем нет конструкторов в том числе унаследованных приватных protect от полей приватных
Speaker A
protect от баз виртуальных бас виртуальных функций проблема в том что первый пункт довольно интересен сейчас мы его разберём сначала я хочу показать пример пример как можно иметь публичную базу с protected полями на все еще быть агрегатом вот смотрите вот у нас есть
Speaker A
база струг bass у нее есть дефолт конструктор у нее есть здесь поле у нее здесь приватное поле а дальше я говорю у меня есть геральт который от него публично наследует надеюсь все помнят что наследование в структурах по умолчанию публично это не
Speaker A
класс вот и у нее есть только публичное поля все мы теперь можем написать агрегатная инициализацию в агрегатной инициализации у нас база теперь считается частью агрегата база для агрегата инициализации теперь считается чем-то вроде поле мы можем написать bass и потом 3
Speaker A
но самая большая проблема заключается в том что первый пункт можно тонко сломать потому что а что такое user declared конструктор и вот юзер declared конструктор это очень темный и очень мрачный термин потому что конечно если он не тривиальный ну вот например я
Speaker A
сделал я сделал структуру в ней два поля в ней конструкторы зонта который из одного in the конструктор я сделал нетривиальные конструктор из одного in the 2 становлюсь по умолчанию конечно если я потом пишу для этой структуры агрегат мы инициализации то немножко
Speaker A
непонятно что я имею в виду это логично да я ввёл юзер дик life конструкторы все сломал но все класс пласт ленте и только в нем то есть до сих вас построить и вот этот код работал появилась потрясающая по красоте разделение дело в том что все
Speaker A
плохо у вас двум twenty юзер де клерк это необязательно юзер провайдер если вы хотя бы пишите t равно дефолт то это уже юзер declared конструктор он вами не провайдер но он вами де клерк и поэтому если вы вот так написали то вы
Speaker A
сломали агрегат хотя казалось бы то есть агрегат с одной стороны чуть чем плохи агрегаты в сипло сплав и с чем связано большинство пугающих примеров которые приводят люди которые любят приводить пугающий пример большинство пугающих примеров связано с тем что все класс класс
Speaker A
агрегат может случайно получится либо случайно не получится нет никакого с fimo определителя или чего-нибудь еще который мог бы вам с эти агрегаты то все-таки или ни от какого stood и загремит что что смешно вот но тем менее опять-таки
Speaker A
правил мало правило легко запомнить пока что пока что наша чашей наши чаще даже чаше терпения пока что не переполнена пока что все хорошо и логично мы пока что не испуган испуганный мы начинаем быть испуганным и начинаем быть когда у
Speaker A
нас начинается юникорн sequencing все дело в чем допустим у нас есть две структуры смотрите вот эта структура это явно не агрегат а вот эта структура это явно агрегат в ней есть открытые поля и в этой структуре есть открытые поля
Speaker A
это не агрегат потому что в ней есть конструктор это агрегат потому что в ней конструктора нет и кто-то пишет не агрегат с директриса инициализация который использует 45 а потом фу .
Speaker A
и то есть мы используем только что инициализированная поле и для того чтобы инициализировать поле g дальше но ногри гей-бар 45 бар точкой и оглядеть бас сорок пять баз точкой заметьте здесь фигурные скобки здесь круглые здесь агрегатная инициализации вот это вызов конструктора туманов
Speaker A
конструктор это агрегатной инициализации и вместо того чтобы устраивать здесь поединке компиляторов давайте устроим поединке статических анализаторов я набрал этот код на год болте куда недавно прикрутили пвс студию и конечно я воспользовался также clang найди потому что я бы на самом деле
Speaker A
часто чаще пользуюсь clang найди он например бесплатно но зато в студию я болею потому что я в туле делают вот значит и поехали а у нас есть вывод у нас есть у нас есть бар у нас есть вас в скобках написано по мнению clang
Speaker A
taidea это не настоящий корректоре correct это то что говорит long to die а потому что по в студии считает что все они correct она тут проблем не видит соответственно я сделал вывод я понимаю что если у нас убита вывод ничего не
Speaker A
показывает но заметьте что вывод здесь показывает 0 здесь показывает явно что то не то здесь показывает 45 вроде всё хорошо да вот а давайте посмотрим на выдачу наших прекрасных ту лов а если мы посмотрим на в студию то
Speaker A
pvs-studio говорит никаких проблем давайте сделаем калибровочный запуск вдруг его плохо прикрутили в год борту сделаем инициализирован ую переменную выведем ее а этот случай pvs-studio ловят она не шалость твари я был тра-та-та вот соответственно закомментируем его потому что к long long to death не вопрос
Speaker A
сходит с ума вот а и теперь посмотрим и ошарашен все ошибки пропали все хорошо теперь посмотрим что выдал clang той деклан 5 говорит во первых секунд function кол argument is an define она не шалость тут можно проплыть сделать да можно говорить во первых
Speaker A
секунд она не шалость во-вторых он говорит в бар тоже c когда ныне шалость то есть clang найди считает что вот здесь вот здесь мы использовали не инициализированная переменная в инициализатор и а здесь все хорошо кто из них прав в 2020 году прав кванг таити
Speaker A
но до 2020 года не правы оба потому что до 2020 года вот это тоже не обязан было работать даже агрегатная инициализация в таких случаях работать было не обязана потому что порядок в агрегатной инициализации было на спицы fight также как здесь и здесь вот но на
Speaker A
большинстве компьютеров агрегатный инициализации кабель для большинства компиляторов агрегат на инициализация работал и все было хорошо соответственно а в данном случае а в сипло спал 17 все три являются строго говоря ошибкой агрегату инициализацию немножко пофиксили всего осталось 20 и все
Speaker A
проспал 20 вели клаус который говорит что инициализация элементов агрегата вычисляется в порядке элементов и мало того все вычисления значений побочных эффектов ассоциированы с данным элементом sequins be for то есть все упорядоченно если вы делаете агрегатами инициализацию вам гарантирует sequins be
Speaker A
for а потому что чтоб как все было да все все все гарантируется вот это в двадцатом в двадцатом году мы это починили чтобы было как в си но вот эта история а единороги сейчас отыграются уже знаем по в студии отыграться эта история и к
Speaker A
слову ребят с pvs-studio если вы уж при крутились будет болту сделайте себе открытый багтрекер я попытался найти ваш багтрекер чтобы завалить на вас это эту проблему я не смог найти в открыть мне что письма писать вот значит я за файлы туда не
Speaker A
только это а смотрите а вся эта история позволяют нам глубже взглянуть на процесс стандартизации потому что проползал в котором было предложено ето пофиксить он был в целом посвящена тому чтобы сделать как все он был посвящен тому чтобы принести
Speaker A
всему осталось 20 дней ты ты мешал others и давайте впервые на этих лекциях откроем настоящий живую про позу вот на api нас т д арк мы видим а пейпер это пайпер 2017 года как выглядит проползал в стандарт его сделали тим шин
Speaker A
и ричард смит то есть ребята из гугла и обратить внимание проползал стандарт выглядит как из wendy's то есть они а для каждого случая когда не хотят добавить конь пара какой-нибудь новый параграф или изменить культ новый параграф или добавить новый больниц в
Speaker A
начало какого-то параграфа они описывают это текста если вы будете делать свою проползу вы тоже так будете делать это может делать любой человек то есть не нужно ли регистрироваться это можно сделать бесплатно без sms любой может сделать проползал стандарт
Speaker A
если вы готовы пойти но вот эти бюрократические соответственно махинации а и вот мы видим мы видим что вот здесь new параграф вот инициализация saw элементов и двигателем является ты на элемент ордер слова или competitions of side effects sequins be for этот div
Speaker A
относительно 17 стандарта который потом когда 20 standart готовится комитет собирает все такие проползла некоторые из них принимают некоторые нет а потом все который принял мер и получает итоговый 20 standart как они решают мертв конфликты при таком не сильно не сильно машина читаемом
Speaker A
представление проползу я плохо понимаю потому что я почему-то когда я впервые знакомился со всей этой системой много лет назад я ожидал что там что-нибудь в lathe he что-нибудь что можно смел жить что-нибудь такое знаете но нет нет а вот соответственно
Speaker A
проползал вошел соответственно земли ты тренишь all others вошли в 20 standart но только для структур для меня это ниша лазер для массивов не вошли окей так ли все в том котором структуре перечислю но в данном случае поскольку это агрегатной
Speaker A
инициализация нет ну конечно во все во всех случаях это как сына это как со списками инициализации во всех случаях элементаль гор это ордер элементов в структуре ну конечно вот значит а это новая in our door инициализация агрегатов она позволила делать даже
Speaker A
более интересные штуки например она просто позволила прописать продление жизни правыми констант ными продажи в смысле правыми и константами левыми ссылками на инициализации а в случае если у нас есть агрегат внутри которого есть ссылка если мы его инициализируем круглыми
Speaker A
скобками то ссылки провисают но начиная с i + + 20 работает о продлении в текущем фрейме за счет агрегатной инициализации здесь что интересно здесь интересно то что этот пример это один в один пример из стандарта однако clang просто отказывается
Speaker A
принимать этот код когда мы берем последний club я был очень удивлен потому что для готовил эту лекцию я более-менее вот же sie sind и все прекрасно принимает этот код в джи си си все хорошо вот он выводит 42 вводит 2 все отлично вот но
Speaker A
если мы переключим на clang переключи на clown ок но если мы переключим на clang только пила чем field & clock говорит нам клан говорит нам эра рф говорит нам clang но matching конструктор тратата тратата тратата ничего не знаю говорит clang ничего не
Speaker A
хочу видеть ничего не хочу знать а я за файл тикет в клан папскую бак зилу довольно давно потому что я подготовил коллекцию еще до нового года я заварил этот летит еще до нового года клан графский багтрекер соответственно когда он за файле он за
Speaker A
файле 15 декабря вы помните я читал какую-то из прошлых лекций я там в процессе подготовки лекции нашел баба джи си си я его за файл где-то за 3 дня до лекции мне его в день когда я ее записывал на
Speaker A
видео мне его уже заправили этот баг young buck это пример ровный стандарта сипло сплав я поставил ссылку я поставил ссылку на стандарт я поставил что до целый нет клаус такой to having сэмпл я один в один скопировал экзем пол
Speaker A
стандарта и сказал ребят ваш комп не работает адресе работает вот пожалуйста ссылка на год болт проверьте и что вы думаете хоть кто-нибудь отреагировал а что бесит что они бесят валуек ланге это отличные компиляторы отличная отличная система разработки компиляторов но по
Speaker A
сравнению с джесси им вообще наплевать просто наплевать они не смотрят какие баги на них failed и я не знаю почему почему это так хорошо развиваются может быть я там в каком-нибудь 100 плести не исключено вот но у меня сейчас за файле на 8 текке
Speaker A
8 тикетов новинку long вы можете сказать хорошо но ты же ты же ты жил веб разработчик десятки тысяч строк в каком-нибудь я джеси которые вполне сел в поезд и в каком-нибудь 7 капоэйре который вполне себе clang bass ты все видят на гитхабе
Speaker A
эти тысячи строк твоего кода в этих компиляторов почему ты не пойдешь и не пофиг sesh это скорик lange а я хочу сказать я попробовала один раз несколько лет назад я попробовал затащить в элвин маленький комитет который фиксер constraint и для
Speaker A
кастомных онлайн ассемблеров там у них была очевидная проблема с этими штуками и чтобы вы думали я послал значит на их замечательный фабрикатор review if u тоже загнали бизли мне задом licks нельзя мы все о ком он в общем я решил
Speaker A
что я буду посылать почивал увидим и кванг только за деньги когда от высшего francers почему-то джесси тоже у концерта в джесси и мои патчи принимали хорошо и баги от меня текста хорошо вот это open source и другое panzer сна
Speaker A
почему-то один пункт source лучше другого а до g set a free software free as a freedom great теперь однако это дает квест у нее возможность отыграться не так ли потому что получается что clang пойди а это явно проблема смотрите давайте на нее
Speaker A
посмотрим ещё раз это явно проблема которую может поймать стату на лиза тарной так ли это висячая ссылка это висячая ссылка и и может поймать стад анализатор но не может а ну в данном случае не может поймать хонг найди
Speaker A
давайте посмотрим давайте посмотрим сможет ли ее поймать ps сейчас а значит для этого нам нужно добавить tube так эту vistudio и мы видим что нет не может но по-крайней мере орда извиняясь сначала нужно переключить компилятор чтобы он смог мало
Speaker A
скомпилировать we study почему-то не может начать анализ если компилятор не может откомпилировать но вот калькулятор может откомпилировать и певец ту я смогла начать анализ обратите внимание парсер у них нет long bay ст они нашли замечательную проблему что мы
Speaker A
не возвращает значение имя такую проблему стандарт если мы не возвращать значение она возвращает 0 к кому вот а но по крайней мере они не свалились то есть в период студии явно сделан парсер для плюсового кода лучше по крайней мере в этом отношении луч может
Speaker A
быть других отношениях хуже да а в этом отношении у лучше чем в clang той де чем чем хорошо иметь больше одного стакана лазера на год болт сюда вообще хорошо в проекте иметь больше одного стопы на лазер хорошо еще одним
Speaker A
бесплатными были вот а и тем не менее тем не менее пока не справляются ребята поэтому заведите открытый багтрекер не просто заведите открытый багтрекер если вы вы вы вы заведете как делают фланг тогда будет бесполезно по понятной причине развитие открытый bug tracker и
Speaker A
реагировать там на баги все-все чего хочется и так фигурные скобки все что вам нужно сделать чтобы избежать проблем с фигурными скобками это запомнить всего три их перегруженных значения если это агрегат то инициализация фигурными скобками это всегда агрегатная инициализация она не может быть ниже
Speaker A
лазер листом потому что как только у вас появляется конструктор смешал озер листом обычный агрегат если это агрегатная инициализация то разрешенный дези где этот ниша lasers разрешены несмотря на фигурные скобки сужающие преобразования и упорядоченно побочные эффекты если у вас есть ниша лазер лист
Speaker A
кто принце али зация фигурно и скобками ты не социализации мешалась лис которым в этом случае побочные эффекты тоже упорядоченная вот сужающие преобразование дизельный тоньше вы others уже не разрешены и наконец если у вас просто вызов конструктор или вылью
Speaker A
не шалость если скобки пуст и тогда ничего из этого не работает ни побочных эффектов не сужающих преобразований не дизельная это та ниша lasers при фигурных скобках не разрешено и это все это делает всю комбинацию сложных примеров которых которыми всех
Speaker A
пугают легкой потому что теперь пугающих примеров почти не остается и для того чтобы ориентироваться в этом еще лучше вернемся к китайской классификации животных борхеса я обещал у нас бархи сеанс к спецификации животных как вы помните на лекции по перегрузкам мы
Speaker A
сказали что животные делятся на принадлежащих императору похожих из длинному в бродячих собак 5 класс еще мог немножко пересекаться потому что похоже издали на муху попугаи может приближать императору не так ли так вот давайте запомним на что делятся инициализация в сипло сплав это
Speaker A
во-первых zero инициализация глобальные интер и инициализирован дефолт инициализацию конструкторы вызван конструктор по умолчанию если это если бы это был просто int он бы вообще не буду ниц и ализе rowan если это не вектор у него есть конструктор по
Speaker A
умолчанию конструктор по умолчанию вызван дальше целью дальше вылью инициализация дальше копи инициализация директ инициализация директ листами социализация копи лист инициализации все-все-все вот настолько правда три смысла перегруженных фигурных скобок 7 семантических категорий инициализации одна из них конечно может перетекать в
Speaker A
другую а давайте немножко поподробнее перегруженный категории инициализации и на этом закончить итак берлинцы alizade zero initialization это либо ноль конвертируем ft либо рекурсивный инициализация zero венчали зация базовых классов полей элементов массива это глобальный или среды около объекта без конструкторов по умолчанию близнецы
Speaker A
а лиза тароф дефолт инициализация это либо вызов конструктора по умолчанию либо ничего до скаляр кроме того это используется в нью экспресс без инициализатор of для локальных не статических переменных бизнес реализаторов в общем дефолт инициализации это либо default конструктор либо не что в или
Speaker A
уникализации а вот это интересно потому что выльется лизации от на самом деле либо zero инициализации либо дефолт инициализации то есть зелень соли зация это просто удобный способ записать то или другое в зависимости от того что вам больше нравится но чтобы объект точно был
Speaker A
инициализирован например если вы напишете int и и фигурные скобки то есть в синтаксисе вы или инициализации то вы поскольку это скаляр получаете серая инициализацию если вы записываете блок если вы записываете а фигурные скобки и у вас конструктор по умолчанию вы получаете
Speaker A
zero инициализацию потому что это рекурсивная zero zero инициализация однако если вы записываете в или инициализацию и у вас определенный вами конструктор то вы получаете дефолт инициализацию потому что вы определили конструктор и вы знаете что делать именно поэтому вылью инициализация
Speaker A
поскольку она когда нужно сфера кондрат ужин дефолт она иногда бывает хорошим выбором дальше еще одна пара тоже даже как серые дефолта топора еще одна пара это копии директ копии это что-то типа type вылью равно x прошин директ а то что-то типа type в
Speaker A
или экспресс кроме того копии это что-то типа передача аргументов возврата заточении с функции копи инициализации это выброс обработка исключения окопе не социализации это также агрегатный инициализации почему агрегатной инициализации собственно не выйдет в отдельную категорию потому что если вы
Speaker A
делаете через равно в теле структуру то это копия инициализация с другой стороны директ инициализации это что-то типа ну просто инициализации что-то типа new ниша лазер что-то типа стать и каст что-то типа фанкшн и converge и functional конверсию на то еще один
Speaker A
способ преобразования типа которые есть сипло спас на его нет все это когда вы пишите им от x как бы вызываете функцию int с аргументом x машину конверсия иногда используется хотя я конечно рекомендую если вы делать каст все-таки писать каст
Speaker A
и листьями цели за счет лист инициализация распадается на direkt лист инициализация копи лиственница лизы шин при этом сужающие преобразование запрещены и очень часто вы можете опускать часть скобок особенно если у вас инициализируется агрегат потому что лист инициализация как мы помним это три
Speaker A
перегруженных значений лиственница лизой шин может быть директ инициализация может быть копий залезаешь он может быть настоящей директ лиственница лишь и если у вас есть и миша лазер лист или настоящий кофе лиственница лизы и наконец лиственницы азия может быть
Speaker A
также агрегатный цели дышит то есть лист инициализация то есть нашей uniform инициализация когда вы пишете фигурные скобки и в этом случае если у вас есть агрегаты вы например вот немножко упростили себе жизнь это тоже работает то есть смотрите вот у вас есть
Speaker A
структура с одним полем и вы опустили один уровень скобок в до на самом деле можете написать еще одни фигурные скобки вокруг булыкин и вы можете это сделать плоск вот тоже такое небольшое исключение и поскольку солью не форм инициализации именно в том что всюду
Speaker A
используются имени формуле используются фигурные скобки на самом деле все это списочный инициализатор и конечно если вы пишете thb тогда на директ и нет она же директ лиственниц если вы пишете for all too по списку ты так пили стынет если вы пишете struct с и
Speaker A
здесь пишете x и в фигурных скобках x to the direct не станет и все это вся наша униформа детализация от на самом деле списочный это на самом деле специализация которое просто распадается на все остальное и теперь все на самом
Speaker A
деле просто вы можете сами де кодировать сложные случаи например вы видите два конструктора вы видите что это дирекция инициализация в директ лиственницы лизой шин для директ лист инициализация у нас есть правило сначала смотрим на миша лазер лист это абсолютно не пугает особенно если мы
Speaker A
знаем как посмотреть в стандарт если что-то пошло не так и и и результат вполне и даже программе все таки начал нас пугать дадим ли мы гайдлайн никаких гайд лайков а потому что если вы сформируете в себе это понимание это
Speaker A
дальше у вас начинается только наслаждения дальше вы начинаете замечать как это превосходно работает вместе наслаждаться потому что смотрите вы видите как у вас написано фуад пустых фигурных скобок что это вообще-то это копий листы не залезаешь но это вылью инициализация
Speaker A
если выиграла фуад int это дефолт и ниц директ инициализации и это дефолт инициализация если выиграла перегрузка от референсы потом связывание с этим референсом дефолта инициализирована во значения либо это капельницы я лишь на если выиграла перегрузка от вылью предлагаемая дефолт инициализация того
Speaker A
чего потом будете копировать и что теперь мы знаем об инициализации вся нет сегодня мы рассмотрели только синтаксические и семантические аспекты инициализации но на самом деле кроме грамматических конструкций и их смысла есть еще связь инициализация с временем жизни и областью видимости и связь
Speaker A
инициализации с временем жизнью области видимости это отдельная большая тема в частности вот саша задал замечательный вопрос как инициализации с равно кого объекты что можно и что нельзя делать инициализатор асср одно call объект или например спросите себя знаете ли вы что значит выражение в
Speaker A
класс лишилась твой рингу вокал если это английское слово которое примерно означает то что означает русское слово напрасно напрасно инициализированная переменная между прочим от слова довольно часто встречается стандарте или там когда именно инициализируется глобальный объект или что динамически инициализация
Speaker A
вот то есть у нас на самом деле осталось много тем но эти темы уже связано с другим они связаны исключительно с областью видимости времени жизни и мы поговорим о них даже не в следующий раз мы отложим этот разговор на существенно
Speaker A
подальше потому что там тоже есть много восхитительных моментов но вот именно там начинаются сложная вещь и вот именно про сложные вещи начинающиеся там я вообще не видел чтобы кто-нибудь особо говорил здесь у нас очень мало референсных видео я не видел даже такого
Speaker A
доклада носить их он может быть не стоит готовить такой доклад и подать его на силикон потому что если я например переведу на английский вот эти слайды и выдаст ними на секунд я боюсь ездить из придет в зал и чем-нибудь меня спросит
Speaker A
или по-крайней мере чем-нибудь меня бросить вот а на сегодня у меня на этом всё всем спасибо
Topics:C++инициализациястандарт C++ S-classмассивыструктурыстатический анализclang-tidyPVS-Studioпрограммированиеошибки компиляции











