Описание тега 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…
21 июн '18 в 08:09
1
ответ
Есть ли declval для указателей функций?
У меня есть функция, и мне нужно проверить, могу ли я передать ей аргумент заданного типа. Например: template<typename T, auto F> decltype(F(declval<T>{})) foo(); призвание foo<int, bar>() делает 2 вещи: Устанавливает тип возврата …
01 мар '19 в 15:11
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 перемен…
01 июн '18 в 21:20
2
ответа
Могу ли я использовать declval для создания неиспользованного возврата?
Допустим, у меня есть шаблонизированная функция, которая будет специализированной, поэтому меня не волнует базовая реализация. Могу ли я сделать что-то вроде этого: template <typename T> T dummy() { assert(false); return declval<T>(); } …
08 апр '19 в 17:35
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…
19 май '19 в 21:23
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 : Возврат …
03 июн '21 в 20:40
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