Spec-Zone.ru › C++

std::declval

Определено в заголовке <utility>
template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
(с C++11)

Преобразует любой тип T в тип ссылки, что позволяет использовать члены-функции в операнде спецификатора decltype без необходимости прохождения через конструкторы.

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

Обратите внимание, что std::declval может использоваться только в невычисляемых контекстах и не обязана быть определенной; вычисление выражения, содержащего эту функцию, является ошибкой. Формально, программа является некорректной, если эта функция используется по правилу ODR.

Параметры

(нет)

Возвращаемое значение

Не может быть вызвана и, следовательно, никогда не возвращает значение. Тип возврата — T&&, если T является (возможно, с квалификаторами cv) void, в этом случае тип возврата T.

Возможная реализация

template<typename T>
typename std::add_rvalue_reference<T>::type declval() noexcept
{
    static_assert(false, "declval not allowed in an evaluated context");
}

Пример

#include <iostream>
#include <utility>
 
struct Default
{
    int foo() const { return 1; }
};
 
struct NonDefault
{
    NonDefault() = delete;
    int foo() const { return 1; }
};
 
int main()
{
    decltype(Default().foo()) n1 = 1;                   // type of n1 is int
//  decltype(NonDefault().foo()) n2 = n1;               // error: no default constructor
    decltype(std::declval<NonDefault>().foo()) n2 = n1; // type of n2 is int
    std::cout << "n1 = " << n1 << '\n'
              << "n2 = " << n2 << '\n';
}

Вывод:

n1 = 1
n2 = 1

См. также

decltype спецификатор(C++11) получает тип выражения или сущности
result_ofinvoke_result
(C++11)(удалено в C++20)(C++17)
вычисляет тип результата вызова вызываемого объекта с набором аргументов
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/declval

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API