Telegram Web Link
Какая строка приведет к ошибке компиляции?
Anonymous Quiz
20%
3
19%
6
20%
7
9%
8
16%
9
17%
ошибок нет
👆Объяснение к предыдущему вопросу

👨🏻‍💻 Если тип T встраивает тип X, то T получает все методы X. В частности, если X является типом интерфейса, вложение заставляет T реализовать X. Программа скомпилируется, но в ходе выполнения выкинет панику с ошибкой переполнения стека.

Задачи и тесты по программированию
👆Пояснение к предыдущему вопросу

👨🏻‍💻 Так как функция call_with вызывается без шаблонов, компилятор попытается вывести тип T сам. Так как lambda не является std::function, то внутренний тип вывестись не может, и компилятор должен выкинуть ошибку.

Условно, C++ не разрешает конвертацию в шаблонный тип, потому что не понимает какая конвертация должна совершиться, какую std::function<void(T)> выбрать.

Задачи и тесты по программированию | proghub
👆Пояснение к предыдущему вопросу

👨🏻‍💻 Это правда, что Stop может не позваться, но за Start может стоять специальная логика, которая может позвать Stop, это не самая важная проблема написанного кода. Самая важная -- при инициализации Derived, periodicclosure не знает, что исполнять, а так как vptr инициализируется после Base конструктора, но до конца Derived constructor, может случиться datarace https://stackoverflow.com/questions/6591859/when-does-the-vptr-pointing-to-vtable-get-initialized-for-a-polymorphic-class

Отсутствие виртуального деструктора тоже большая проблема, но она не приведёт к ошибке компиляции. Поэтому этот вариант выбирать не стоило. Остальные варианты разрешены стандартом.

Такие Race ловит ThreadSanitizer, см https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces#data-race-on-vptr-during-construction

Задачи и тесты по программированию | proghub
2025/07/08 13:34:29
Back to Top
HTML Embed Code: