Описание тега declval

2 ответа

Использовать invoke_result с типом аргумента void?

Я пытаюсь сделать следующее: struct Unwrapper { template<typename T> auto operator()(const T& arg, std::enable_if_t<isPrimitive<T>, void>* = nullptr) {return arg;} template<typename T> auto operator()(const T& arg, st…
07 янв '19 в 11:10
1 ответ

std::declval и неоцененные выражения

Со ссылкой на следующий пример в Предложении поддержки стандартной библиотеки для идиомы обнаружения C++: // primary template handles types that do not support pre-increment template< class, class = void_t<> > struct has_pre_increment_me…
18 апр '18 в 01:24
2 ответа

Concepts/SFINAE ошибка с именем типа

Я пытаюсь сделать простой пример для себя, используя новый синтаксис концепции. Я решил проверить, определен ли для типа оператор operator(), и создал структуру для проверки этого с использованием парадигмы SFINAE, но я сталкиваюсь с проблемами типо…
23 июн '18 в 17:51
1 ответ

Идиома обнаружения и совпадение типов параметров по умолчанию

Я могу написать следующее, чтобы определить, сериализуем ли объект. template <typename T, typename = int> struct is_serializable : std::false_type {}; template<typename T> struct is_serializable <T, decltype(std::declval<std::ostre…
1 ответ

Есть ли declval для указателей функций?

У меня есть функция, и мне нужно проверить, могу ли я передать ей аргумент заданного типа. Например: template<typename T, auto F> decltype(F(declval<T>{})) foo(); призвание foo<int, bar>() делает 2 вещи: Устанавливает тип возврата …
2 ответа

Как мы можем проверить, может ли выражение определенного типа вызываться с помощью prvalue?

С C++17 у нас есть новое is_invocable и представьте новые ценности, которые на самом деле не являются ценностями. Это позволяет вам создавать объект без необходимости сначала логически его конструировать, а затем исключать конструкцию. Я столкнулся …
09 янв '18 в 18:32
1 ответ

Как использовать decltype в качестве LHS выражения большего типа при компиляции в VS2010-VS2015

У меня есть две версии кода, которые используют decltype а также declval, Один работает, а другой нет. Они включены ниже. Я проверил это на VS2017 и ниже, и я получаю те же результаты. VS2018 скомпилирует его. GCC и Clang компилируют все это. Ошибка…
05 ноя '18 в 13:01
2 ответа

Как написать C++ typedef, используя decltype и declval, чтобы сделать его переносимым?

У меня есть следующее template <typename F, typename A0> struct ResultOf { typedef typename decltype(boost::declval<F>()(boost::declval<A0>())) Type; }; Он был написан так, чтобы VS2010 мог иметь result_of, который работал для конк…
16 окт '18 в 07:50
1 ответ

Нулевая инициализация типа

Дана переменная целого типа без знака: foo допустим, я хочу сделать это: const decltype<foo> bar{}; cout << (55834574890LL & ~bar) << endl; Это дает мне ожидаемое 42. Но теперь давайте скажем, что я хочу покончить с bar перемен…
2 ответа

Могу ли я использовать declval для создания неиспользованного возврата?

Допустим, у меня есть шаблонизированная функция, которая будет специализированной, поэтому меня не волнует базовая реализация. Могу ли я сделать что-то вроде этого: template <typename T> T dummy() { assert(false); return declval<T>(); } …
1 ответ

Понимание declval оптимизированной реализации

Глядя на исходный код libstdC++, я нашел следующее declval реализация: template<typename _Tp, typename _Up = _Tp&&> _Up __declval(int); // (1) template<typename _Tp> _Tp __declval(long); // (2) template<typename _Tp> auto d…
0 ответов

Как получить тип аргумента шаблона переменной?

Я не могу найти способ определить тип как это: template<typename TFirst, typename TSecond, typename ... Args> using hasSomeFunc = decltype(std::declval<TSecond>().SomeFunc<TFirst, Args...>(std::declval<std::function<void(TFir…
04 июн '19 в 13:51
1 ответ

NoneStd ::declval против crtp, не может вывести тип возврата метода из неполного типа

Я пытаюсь сделать что-то вроде этого (в C++11): #include <utility> template <typename T> struct base { using type = decltype( std::declval<T>().foo() ); }; struct bar : base<bar> { int foo() { return 42;} }; int main() { bar:…
07 июн '19 в 19:07
2 ответа

Должен ли T быть полным типом для использования в `std::declval <T>`?

Рассмотрим этот пример ( отсюда): #include <type_traits> #include <iostream> template <typename U> struct A { }; struct B { template <typename F = int> A<F> f() { return A<F>{}; } using default_return_type = declt…
10 дек '19 в 16:12
1 ответ

Для чего T std::declval <T> () не имеет функции сопоставления?

Я был удивлен, обнаружив, что для некоторых T, decltype(std::declval<T>()) не законно: #include <utility> template<typename T> using Alias = decltype(std::declval<T>()); // as expected using A1 = Alias<int>; using A2 = …
06 окт '19 в 14:28
3 ответа

Компилятор, определяющий аргумент шаблона

template<typename T> class A { public: A(T &t) : t_(t){} T t_; }; int main() { int value; A<decltype(value)> a(value); // what I wish for : A a(value); // which does not compile "missing template argument before 'a'" } Есть ли способ…
15 фев '20 в 15:33
2 ответа

Почему реализация declval в libstdC++ - v3 выглядит такой сложной?

Код ниже взят из libstdC++-v3 std::type_traits , который является реализацией std::declval: template<typename _Tp, typename _Up = _Tp&&> // template 1 _Up __declval(int); template<typename _Tp> // template 2 _Tp __declval(long); …
25 сен '20 в 11:54
1 ответ

Использование declval со ссылочным типом

Я вижу несколько примеров кода, в которых тип, используемый для создания экземпляра функции шаблона, указан как ссылочный тип, а не просто тип, как в: std::declval<T &>() в отличие от: std::declval<T>() где Tэто какой-то тип. Мне не …
28 апр '21 в 23:18
3 ответа

Является ли std::declval устаревшим из-за гарантированного исключения копирования?

Стандартная библиотечная утилита определяется как: template<class T> add_rvalue_reference_t<T> declval() noexcept; Добавление здесь ссылки на rvalue казалось хорошей идеей, если вы думаете о языке, когда он был введен в C++ 11 : Возврат …
0 ответов

Почему std::declval <int> () не является lvalue, когда std::declval <int&> () имеет значение?

Первая из этих двух строк не компилируется, вторая компилируется в MSVC 2017: // std::cout << sizeof(decltype(++std::declval<int>())) << "\n"; //error. expression must be a modifiable lvalue. std::cout << sizeof(decltype(++st…
15 июн '21 в 22:56