std::declval
|
|
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
| Заголовочный файл <utility>
|
||
| template< class T > typename std::add_rvalue_reference<T>::type declval(); |
(начиная с C++11) | |
Преобразует любой тип T в ссылочный тип, позволяя использовать его функции-члены в выражениях decltype без явного создания объекта. Это широко используется в шаблонах, в которых параметр шаблона может не иметь в общем случае конструктора по умолчанию, но имеющий функцию-член, возвращающую значение требуемого типа. std::declval может использоваться только в невычислимых контекстах. Вычисление выражения, содержащего эту функцию, является ошибкой.
Содержание |
[править] Параметры
You can help to correct and verify the translation. Click here for instructions.
[править] Возвращаемое значение
Не может быть вызвана, следовательно, никогда не возвращает значения. Тип возвращаемого значения — T&&, и T для lvalue-значений.
[править] Исключения
[править] Пример
#include <utility> #include <iostream> struct Default { int foo() const {return 1;} }; struct NonDefault { NonDefault(const NonDefault&) {} int foo() const {return 1;} }; int main() { decltype(Default().foo()) n1 = 1; // int n1 // decltype(NonDefault().foo()) n2 = n1; // will not compile decltype(std::declval<NonDefault>().foo()) n2 = n1; // int n2 std::cout << "n2 = " << n2 << '\n'; }
Вывод:
n2 = 1
[править] См. также
| decltype спецификатор | определяет тип эквивалентен типу выражения (C++11)
Original: defines a type equivalent to the type of an expression (C++11) The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
| (C++11) |
выводит тип возвращаемого выражения вызова функции Original: deduces the return type of a function call expression The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (шаблон класса) |