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

std::declval

Материал из cppreference.com
< cpp‎ | utility

Определено в заголовочном файле <utility>
template< class T >
typename std::add_rvalue_reference<T>::type declval();
(начиная с C++11)

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

Содержание

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

(Нет)
Оригинал:
(none)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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

Не может быть вызвана, следовательно, никогда не возвращает значения. Тип возвращаемого значения — 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)
Оригинал:
defines a type equivalent to the type of an expression (C++11)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
[edit]
(C++11)
выводит тип возвращаемого выражения вызова функции
Оригинал:
deduces the return type of a function call expression
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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