Термины type deduce, track, stick, commit - что они означают?
- Подскажите что означают термины type deduce, stick, track, commit? (https://youtu.be/xnqTKD8uD64?t=3046)
Насчёт type deduce инфу нашел - определение типа впоследствии, лежит в основе auto и шаблонов. (так ведь?)
Суть остальных терминов к сожалению не понял.
- Что происходит в
auto pb = unique_ptr<base>{ make_unique<derived>() };? (https://youtu.be/xnqTKD8uD64?t=2952)
Правильно ли я понимаю, что это передача make_unique<derived> как r-value в инициализацию unique_ptr<base>, после чего, согласно move-семантике unique_ptr, владение derived-объектом передаётся unique_ptr<base>?
Ответы (1 шт):
- deduce - да, это вывод типа. Это наверное самая главная фишка auto - позволить компилятору самому вывести тип. Больше здесь https://effective-modern-cpp.readthedocs.io/en/latest/chapter1.html или в известных книгах Майерсах.
- stick на несколько минут раньше https://youtu.be/xnqTKD8uD64?t=2979 рассказывается, что stick - это явное указание типа в каком то виде. Например,
auto x = type{ expr }; - track - здесь имеется ввиду, что если код написан с массовым использованием auto, то тип у переменных все равно есть точный и компилятор за ними следит (слово track можно перевести как отслеживает) - and the variable’s type automatically tracks other functions’ and expressions’ types unless you explicitly said otherwise.. В результате, можно только в ключевых местах расставить типы, а все остальное сделает компилятор сам. Если нужно поменять тип, то это можно опять же сделать в нескольких местах, а не по всей программе.
- commit - тут видимо сокращение от "commit to a type" - явно определить тип. На сайте у Саттера оно часто употребляется в таком контексте. очень близко к stick. Мне нравится вот такой пример - функция as_unsigned которая делает так, что тип будет беззнаковым. То есть, мы "коммитимся" (как бы делаем обещания), что наш тип должен иметь такие гарантии.
Что делает
auto pb = unique_ptr<base>{ make_unique<derived>() };?
Здесь создается один unique_ptr, который потом передается другому. В вопросе Вы правдоподобно все написали. А вот зачем он так пишет - это интересно. Как по мне, он хочет использовать auto просто везде где это можно и в процессе рождаются вот такие монстры. В принципе это ничем не отличается от приведенного выше auto x = type{ expr };