У мові програмування C++ decltype — оператор для отримання типу виразу. Він був введений в поточній версії стандарту, C++11. Головне його призначення у використанні в узагальненому програмуванні, коли часто складно або й неможливо виразити типи, що залежні від параметрів шаблону.

Із набуттям популярності узагальненим програмуванням в 1990х, окреслилась потреба в механізмі виведення типів. Багато постачальників компіляторів, базуючись на вже існуючих механізмах мови, втілили власні версії оператора, зазвичай названі typeof, і деякі переносимі версії з обмеженою функціональністю. В 2002, Бьярн Страуструп запропонував додати в С++ стандартизовану версію, і припустив назву «decltype», вона відображала те, що оператор повертає «задекларований тип» виразу.

decltype розробили для зручного використання як укладальникам узагальнених бібліотек так і програмістам початківцям. Зазвичай, виведений тип відповідає типу об’єкта або функції точнісінько як той він визначений в сирцевому коді. Подібно до оператора sizeof, операнд decltype не обчислюється.

Семантика Подібно до оператора sizeof, операнд decltype не обчислюється. Неформально, тип повернутий decltype(e) виводиться так: Якщо аргумент це не взятий у дужки ідентифікатор або не взятий у дужки доступ до члену класу, тоді decltype видає тип сутності, яку представляє цей вираз. Якщо такої сутності не існує, або ім'я аргументу це набір перевантажених функції, програма неправильна. Якщо аргумент є будь-яким іншим виразом типу T і якщо це xvalue, тоді decltype видає T&&; якщо це lvalue, тоді decltype видає T&; якщо це prvalue, тоді decltype видає T;

Таку семантику розробили для задоволення потреб програмістів бібліотек шаблонів, але так щоб одночасно вона була інтуїтивно зрозуміла для програмістів новачків, бо тип, який повертає decltype завжди збігається з типом об'єкта або функції точно як визначено в сирцевому коді. Формальніше, Правило 1 застосовується до id-виразів без дужок і виразів доступу до членів класу. Для викликів функцій, виведений тип є тип до повернення статично вибраної функції, як це визначають правила для перевантаження функцій. Приклад:

const int&& foo(); int i; struct A { double x; }; const A* a = new A(); decltype(foo()) x1; // типом є const int&& decltype(i) x2; // типом є int decltype(a->x) x3; // типом є double (оголошений тип) decltype((a->x)) x4; // типом є const double& (lvalue вираз)

Причиною відмінного типу у двох останніх рядках є те, що вираз у дужках (a->x) не є іменованим об'єктом. Оскільки вираз є lvalue, його виведений тип є «посилання на тип виразу» або const double&.

Примітки

Посилання Bjarne Stroustrup's C++0x FAQ entry for decltype