Сегодня многие библиотеки шаблонов предоставляют генераторы объектов для упрощения создания объектов с помощью средства вычисления аргументов шаблона C++. рассмотреть<std::pair>. Для того, чтобы инстанцировать этот шаблон класса и создать временный объект этой инстанциации, необходимо предоставить конструктору параметры шаблона, а также параметры:
std::pair<int, double>(5, 3.14159);
Чтобы избежать этого дублирования, STL поставляет генератор объектов<std::make_pair>. При его использовании типы параметров шаблона выводятся из приведенных аргументов функции:
std::make_pair(5, 3.14159);
Для временных объектов этого достаточно. Однако при выделении именованного объекта проблема появляется вновь:
std::pair<int, double> p(5, 3.14159);
Генератор объектов больше не помогает:
std::pair<int, double> p = std::make_pair(5, 3.14159);
Неплохо было бы вывести тип объекта (слева) из выражения, с которым он инициализируется (справа), но текущий синтаксис C++ этого не допускает.
Приведенный выше пример демонстрирует суть проблемы, но не демонстрирует ее масштаб. Многие библиотеки, особенно библиотеки шаблонов выражений, создают объекты действительно сложных типов и идут долгий путь, чтобы скрыть эту сложность за генераторами объектов. Считай, что это круто. Lambda functor:
_1 > 15 && _2 < 20
Если бы захотелось выделить именную копию такого невинно выглядящего функтора, ей пришлось бы указать что-то вроде этого:
lambda_functor<
    lambda_functor_base<
        logical_action<and_action>,
        tuple<
            lambda_functor<
                lambda_functor_base<
                    relational_action<greater_action>,
                    tuple<
                        lambda_functor<placeholder<1> >,
                        int const
                    >
                >
            >,
            lambda_functor<
                lambda_functor_base<
                    relational_action<less_action>,
                    tuple<
                        lambda_functor<placeholder<2> >,
                        int const
                    >
                >
            >
        >
    >
>
f = _1 > 15 && _2 < 20;
Не совсем элегантно. Для решения этой проблемы (а также некоторых других проблем) комитет по стандартизации C++ рассматривает несколько дополнений к стандартному языку, например<typeof/decltype>и<auto>(см.http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1607.pdf).
Оператор<typeof>(или<decltype>, который имеет несколько иной вкус<typeof>) позволяет определить тип выражения во время компиляции. Используя<typeof>, приведенный выше пример можно значительно упростить:
typeof(_1 > 15 && _2 < 20) f = _1 > 15 && _2 < 20;
Гораздо лучше, но до сих пор существует некоторое дублирование. Тип<auto>решает остальную проблему:
auto f = _1 > 15 && _2 < 20;
Цель этого повышения. Тип библиотеки должен обеспечивать библиотечное решение, которое может быть использовано до тех пор, пока языковое средство не будет добавлено в стандарт и не станет широко доступным.