Функция 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