РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
724 of 815 menu

Функция declval

Функция declval из заголовочного файла <utility> преобразует переданный тип в rvalue-ссылку. В качестве параметра мы передаем шаблонный тип T, а функция возвращает T&&. Основное применение - использование в шаблонном метапрограммировании, например внутри decltype или noexcept, когда нужно получить тип выражения без создания объекта.

Важно понимать, что declval не имеет определения и предназначена только для использования в невычисляемом контексте. Попытка вызвать ее в рантайме приведет к ошибке компиляции.

Синтаксис

#include <utility> std::declval<T>()

Пример

Давайте получим тип результата сложения двух чисел, используя declval внутри decltype:

#include <iostream> #include <utility> using namespace std; int main() { using T = decltype(declval<int>() + declval<double>()); cout << sizeof(T) << endl; return 0; }

Результат выполнения кода:

8

Пример

Давайте проверим, имеет ли тип метод size, используя declval в decltype:

#include <iostream> #include <utility> #include <string> #include <vector> using namespace std; template <typename T, typename = void> struct has_size : false_type {}; template <typename T> struct has_size<T, void_t<decltype(declval<T>().size())>> : true_type {}; int main() { cout << has_size<string>::value << endl; cout << has_size<int>::value << endl; return 0; }

Результат выполнения кода:

1 0

Смотрите также

  • decltype,
    который определяет тип выражения
  • forward,
    который выполняет идеальную передачу
  • move,
    который преобразует в rvalue-ссылку
  • enable_if,
    который включает шаблон по условию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить