decltype

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

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

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

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

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

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

  1. Якщо аргумент це не взятий у дужки ідентифікатор або не взятий у дужки доступ до члену класу, тоді decltype видає тип сутності, яку представляє цей вираз. Якщо такої сутності не існує, або ім'я аргументу це набір перевантажених функції, програма програма неправильна.
  2. Якщо аргумент є будь-яким іншим виразом типу T і
  1. якщо це xvalue, тоді decltype видає T&&;
  2. якщо це lvalue, тоді decltype видає T&;
  3. якщо це prvalue, тоді decltype видає 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& (lvalue вираз)

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

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

  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. 
  5. Miller, William M. (2009-08-03). C++ Standard Core Language Closed Issues, Revision 65. ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Процитовано 2009-09-04. 

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