Страницы

Поиск по вопросам

понедельник, 28 января 2019 г.

Новые правила выведения шаблонного типа в c++17

Что дают новые правила выведения шаблонного типа в c++17?


Ответ

В c++17 появилась возможность опускать явное упоминание типов шаблонных параметров при объявлении переменной шаблонного типа. Например, для шаблонного типа S, конструктор которого принимает аргумент, зависимый от T
template struct S { S(const T&) {} };
можно использовать упрощённую запись, вида:
S si(42); S sl(42l); S sd(42.);
На первый взгляд кажется, что все переменные si, sl, sd имеют одинаковый тип. И если бы S не был шаблонным типом, это было бы действительно так. Но в данном случае, реальные типы переменных различны и выводятся из типа аргумента, переданного в конструктор. Эквивалентная запись для прежнего стандарта языка будет выглядеть так:
S si(42); S sl(42l); S sd(42.);
Правда, указывая явно тип в треугольных скобках, нет особого смысла использовать разные типы в аргументах, т.е. можно везде использовать целое 42
Упомянутая выше логика компилятора опирается на неявное выведение типов (Implicit Deduction Guides). Но помимо этого есть и явное (Explicit Deduction Guides). В этом случае можно указать компилятору явно использовать некоторый целевой тип при попытке выведения типа. Например, если после определения шаблона класса добавить такую строку:
S(double) -> S;
то это заставит компилятор выбирать тип int в качестве T, когда аргумент конструктора имеет тип double. Т.е. в этом случае, запись вида:
S sd(42.);
будет уже создавать переменную типа S, а не S. Объект типа S по-прежнему можно будет создать, но тип придётся указывать явно.
О правилах выведения типов можно получить дополнительную информацию в черновике стандарта:
[temp.deduct.guide] [over.match.class.deduct]

Комментариев нет:

Отправить комментарий