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 (18 липня 2007). Decltype (revision 7): proposed wording (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів (PDF) оригіналу за 20 липня 2013. Процитовано 4 вересня 2009.
  2. а б Gregor, Douglas; Järvi, Jaakko; Siek, Jeremy; Stroustrup, Bjarne (28 квітня 2003). Decltype and auto (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів оригіналу (PDF) за 4 червня 2011. Процитовано 13 серпня 2009. {{cite web}}: Недійсний |deadurl=403 (довідка)
  3. а б Becker, Pete. Working Draft, Standard for Programming Language C++ (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів (PDF) оригіналу за 20 липня 2013. Процитовано 4 вересня 2009.
  4. Miller, William M. (3 серпня 2009). C++ Standard Core Language Defect Reports, Revision 65. ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів оригіналу за 20 липня 2013. Процитовано 15 вересня 2009.
  5. Miller, William M. (3 серпня 2009). C++ Standard Core Language Closed Issues, Revision 65. ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів оригіналу за 11 вересня 2009. Процитовано 4 вересня 2009.

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