У мові програмування C++ decltype — оператор для отримання типу виразу. Він був введений в поточній версії стандарту, C++11. Головне його призначення у використанні в узагальненому програмуванні, коли часто складно або й неможливо виразити типи, що залежні від параметрів шаблону.
Із набуттям популярності узагальненим програмуванням в 1990х, окреслилась потреба в механізмі виведення типів. Багато постачальників компіляторів, базуючись на вже існуючих механізмах мови, втілили власні версії оператора, зазвичай названі typeof, і деякі переносимі версії з обмеженою функціональністю. В 2002, Бьярн Страуструп запропонував додати в С++ стандартизовану версію, і припустив назву «decltype», вона відображала те, що оператор повертає «задекларований тип» виразу.
decltype розробили для зручного використання як укладальникам узагальнених бібліотек так і програмістам початківцям. Зазвичай, виведений тип відповідає типу об’єкта або функції точнісінько як той він визначений в сирцевому коді. Подібно до оператора sizeof, операнд decltype не обчислюється.
Семантика#edit
Подібно до оператора sizeof, операнд decltype не обчислюється.[1] Неформально, тип повернутий decltype(e) виводиться так:[2]
- Якщо аргумент це не взятий у дужки ідентифікатор або не взятий у дужки доступ до члену класу, тоді
decltypeвидає тип сутності, яку представляє цей вираз. Якщо такої сутності не існує, або ім'я аргументу це набір перевантажених функції, програма неправильна. - Якщо аргумент є будь-яким іншим виразом типу
Tі
- якщо це xvalue, тоді
decltypeвидаєT&&;; якщо це lvalue, тодіdecltypeвидаєT&;; якщо це 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]
Примітки#edit
- ^ a b 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.
- ^ a b 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.
- ^ a b Becker, Pete. Working Draft, Standard for Programming Language C++ (PDF). ISO/IEC JTC1/SC22/WG21 – The C++ Standards Committee. Архів (PDF) оригіналу за 20 липня 2013. Процитовано 4 вересня 2009.
- ^ 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.
- ^ 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.
Посилання#edit
- Bjarne Stroustrup's C++0x FAQ entry for decltype [Архівовано 18 вересня 2009 у Wayback Machine.]
This article is mirrored from “Decltype” on Українська Wikipedia, revision 47839339, written by Wikipedia's contributors and licensed CC BY-SA 4.0. Editing it here creates a Quire copy with its own history.
Synced with Wikipedia revision 47839339 · just now