Пространства имён
Варианты
Действия

std::declval

Материал из cppreference.com

Заголовочный файл <utility>
template< class T >
typename std::add_rvalue_reference<T>::type declval();
(начиная с C++11)

Преобразует любой тип T в ссылочный тип, позволяя использовать его функции-члены в выражениях decltype без явного создания объекта. Это широко используется в шаблонах, в которых параметр шаблона может не иметь в общем случае конструктора по умолчанию, но имеющий функцию-член, возвращающую значение требуемого типа. std::declval может использоваться только в невычислимых контекстах. Вычисление выражения, содержащего эту функцию, является ошибкой.

Содержание

[править] Параметры

(Нет)
Original:
(none)
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

[править] Возвращаемое значение

Не может быть вызвана, следовательно, никогда не возвращает значения. Тип возвращаемого значения — T&&, и T для lvalue-значений.

[править] Исключения

noexcept-спецификация:  
noexcept
  (начиная с C++11)

[править] Пример

#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.
[edit]
(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.

(шаблон класса) [edit]