close
The Wayback Machine - https://web.archive.org/web/20211007020947/https://ru.cppreference.com/w/cpp/utility/declval
Пространства имён
Варианты
Действия

std::declval

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

 
 
Библиотека утилит
Поддержка языка
Поддержка типа (базовые типы, RTTI, свойства типов)    
Макросы тестирования функциональности библиотеки (C++20)
Управление динамической памятью
Программные утилиты
Обработка ошибок
Поддержка сопрограмм (C++20)
Вариативные функции
(C++17)
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)  
(C++20)
Операции обмена и типа
(C++14)
declval
(C++11)

(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

Элементарные преобразования строк
(C++17)
(C++17)

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

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

Содержание

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

(Нет)

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

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

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

спецификация noexcept:  
noexcept
  

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

#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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
[править]
(C++11)(убрано в C++20)
(C++17)
выводит тип результата вызова вызываемого объекта с набором аргументов
(шаблон класса) [править]