CE (Compile-time errors) — не удалось создать исполняемый файл программы, > лексические ошибки - сломать лексический парсер, написать непонятный набор токенов (\;) > синтаксические ошибка - нарушение правил синтаксиса языка. бинарный плюс без правого оператора (x +) или скобки нехватает, забыто ; > семантические ошибки - нарушение логики языка. неправильный литеральный суффикс (6adsaf), вызов неподдерживаемой операции для типа (строка + инт), ++x++ (инкремент rvalue) или неоднозначное обращение, обращение к функции, методу, полю которое не определено > ошибка нарушения уровня доступа
может быть segfault в compile time из-за глубокой рекурсии инстанцирования шаблонов
RE (Runtime errors) Segmentation fault (нарушение прав доступа) - ошибка, которая возникает, когда обращаемся не к своей памяти (если программа по отношению к ОС совершает недопустимую операцию, то ОС её убивает) Floating point exception (FPE) - возникает в процессоре, деление на 0 в целых числах Не удалось открыть файл, не удалось выделить память. throw Aborted - аварийно завершается операционной системой. Вызывается другими функциями стандартной библиотеки, если что-то пошло не так. Сишная функция abort(). код выхода implementation defined std::terminate() => std::abort()
UB (Undefined behaviour) - может упасть, а может и не упасть возникает потому что компилятор написан для таких программ, в которых нету UB, поэтому при оптимизации могут произойти разные вещи: обращение за границы вектора или строки использование неинициализированной переменной x++ + ++x потому что нет гарантии какое из выражений вычислится первым разыменование невалидного поинтера, переполнение инта, битая ссылка

Unspecified behavior: последовательность выполнения функций в аргументах другой функции: z(a(), b(), c()) Implementation defined behaviour зависит от компилятора, устройства, системы
-Wpedantic кидать варнинги о нарушениях стандарта, которые допустимы, но не стандартизованы (например VLA)

- CE, неоднозначная перегрузка
- CE, так как вызывается от double, а его равнозначно конвертить и в int и в float => неоднозначная перегрузка
приватность проверяется после перегрузки сначала ищется функция в соответствующем поле видимости, потом уже проверяется приватность

проблема, что placement new может менять константные поля. UB, потому что
если была переменная или указатель или ссылка для обращения к объекту, а перед этим кто-то подложил placement new на тот же адрес другой объект, то это имя будет валидно указывать на новый объект, если
- тип объекта остался такой же
- если оригинал был не const
- если оригинал не был классом с const полями
std::launder (С++17)
берёт поинтер и возвращает поинтер на то же самое, ничего не поменяв
но гарантируется, что компилятор забудет всё, что он знал об этом поинтере раньше
по обычному выводилось бы 4, тк компилятор имеет право думать, что на одном и том же адресе объект не поменяет тип (UB), но сейчас он забыл, какой тип был до этого и теперь выводится 3
реализовано низкоуровнево
это было введено, потому что был замечен баг: при пуше и попе в std::vector константных объектов или объектов с константными полями происходило UB. тк компилятор имеел право предполагать, что тип не поменялся, но потом туда std::launder засунули в C++17

крч если мы собираемся на месте, где раньше лежал тип положить другой тип (или если раньше лежал константный объект), то нужно сделать не placement new на это место, а placement new на std::launder от этого места
std::launder предотвращает оптимизации компилятора связанные с девиртуализацией и с константами
std::launder принимает только сишные поинтеры, std::launder от надстройки над поинтером ничего не сделает и будет UB
без 10 строчки не слинкуется
будет так называемая IFNDR - ill formed no diagnostics requiered (undefined reference, линковщик не найдёт определение n)
программа написана некорректно и компилятор не в состоянии это отловить (например нарушение ODR)
memory
exceptions