decltype

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

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

Семантика[ред.ред. код]

Подібно до оператора sizeof, операнд decltype не обчислюється.[1] Неформально, тип повернутий decltype(e) виводиться так:[2]

  1. Якщо вираз e посилається до змінної в локальній або простору імен зоні видимості, статичної змінної члену або параметру функції, тоді результат — це оголошений тип (англ. declared type) змінної або параметру.
  2. Якщо e — це виклик функції або перевантаженого оператора, decltype(e) позначає оголошений тип, що повертається цією функцією.
  3. Інакше, якщо e — це л-значення, decltype(e) — це T&, де T — це тип e; якщо e — п-значення, результатом буде T.

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

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&

Примітки[ред.ред. код]

  1. Dos Reis, Gabriel; Järvi, Jaakko; Stroustrup, Bjarne (2007-07-18). «Decltype (revision 7): proposed wording». ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів оригіналу за 2013-07-20. Процитовано 2009-09-04. 
  2. а б Gregor, Douglas; Järvi, Jaakko; Siek, Jeremy; Stroustrup, Bjarne (2003-04-28). «Decltype and auto». ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Процитовано 2009-08-13. 
  3. а б Becker, Pete. «Working Draft, Standard for Programming Language C++». ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів оригіналу за 2013-07-20. Процитовано 2009-09-04. 
  4. Miller, William M. (2009-08-03). «C++ Standard Core Language Defect Reports, Revision 65». ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів оригіналу за 2013-07-20. Процитовано 2009-09-15. 

Посилання[ред.ред. код]