Кажется, что C++ 14 auto
ключевое слово может отображаться в месте определения функции для указания типа возврата. В этом случае требуется std::result_of
? Разве это не устарело сейчас?C++ 14 'auto' может получить возвращаемый тип функции, нам все еще нужен std :: result_of <>?
ответ
Да, абсолютно.
Иногда требуется тип возврата, но не как результат функции. Предположим, у меня есть
vector<X>
, и я хочу применить функцию к каждому элементу и вернуть результат. Эта операция называетсяmap
илиfmap
, и мы могли бы реализовать подпись Thusly:template <class T, class F, class U = std::decay_t<std::result_of_t<F&(T const&)>>> std::vector<U> map(std::vector<T> const&, F);
Вы можете сделать тип возвращаемого
auto
, но независимо от того, что вам нужно вычислить, что типU
иauto
не даст его вам , Каждый раз, когда вам нужен результат вызова функции, который не обязательно будет возвратным типом,auto
не будет его обрезать.SFINAE. Рассмотрим разницу между:
template <class F> decltype(auto) foo(F f) { return f(0); } template <class F> std::result_of_t<F&(int)> bar(F f) { return f(0); }
Если
F
не invokable сint
, то инстанцированииfoo()
является серьезной ошибки компиляции, ноbar()
будет просто удален из набора перегрузки. Это может быть очень ценным в общем коде, так как вы можете тестировать выражения для корректности.Аннотация.
auto
ничего не говорит о возвращаемом типе функции. Если функция возвращает результат вызова одного вызываемого с некоторыми аргументами,std::result_of_t<F(A, B)>
сам по себе сообщает мне, что делает эта функция.auto
ничего мне не говорит.
Действительно лучший вопрос может быть ... зачем нам std::result_of
если мы имеем decltype
. Они кажутся более близкими. В конце концов, я могу сделать decltype(x+1)
, как я могу выразить это с точки зрения result_of
?! decltype
явно лучше. Ну, оказывается, есть some slight differences между ними, даже когда дело доходит до определения результата вызова функции.
- 1. std :: result_of тип параметра
- 2. C++ 14 auto lambda может принять Obj <std :: tuple <void>> - но функции шаблона не могут?
- 3. Need 'typename' before 'std :: result_of <_Signature> :: type' потому что 'std :: result_of <_Signature>' является зависимым областью
- 4. C++ Невозможно использовать вектор <string> как возвращаемый тип
- 5. не может пройти std :: vector <std :: unique_ptr <>> to std :: thread
- 6. Получить возвращаемый тип метода из указателя функции-члена
- 7. Получить возвращаемый тип функции в шаблоне
- 8. Почему нет std :: result_of <int(int)> :: type valid?
- 9. Зачем нам нужен длинный тип?
- 10. Возвращаемый тип функции, возвращающий функцию std ::
- 11. Как получить возвращаемый тип перегруженного метода в C++?
- 12. Почему «-std = C++ 0x» все еще нужен для g ++ 4.6.2?
- 13. Как получить возвращаемый тип функции для использования в шаблоне?
- 14. IList <> возвращаемый тип вместо списка <>
- 15. C++ возвращаемый тип от функции
- 16. получить конкатенированный тип кортежа; объединить result_of и tuple_cat
- 17. Каков возвращаемый тип класса <?> #getTypeParameters()?
- 18. Возвращаемый тип несовместим с <Interface.functionName>
- 19. C++ 11 result_of выводя мой тип функции не удалось
- 20. Неожиданный сбой SFINAE с использованием std :: result_of
- 21. C++ <неразрешенный перегруженный тип функции>
- 22. шаблон шаблон возвращаемый тип от функции-члена
- 23. Тип типа «тип» в «std :: result_of»; получить тип возвращаемого значения от перегрузки функций
- 24. std :: result_of failing for void return type
- 25. Тип 'std :: map <std :: basic_string <char>, int>' не заполнен
- 26. Получить возвращаемый тип начала на массиве c
- 27. C++ loop std :: vector <std :: map <std :: string, std :: string>>
- 28. «нет подходящей функции для вызова« async »(std :: launch, <неразрешенный перегруженный тип функции>, std :: string &) '"
- 29. using std :: result_of, чтобы определить тип возвращаемого аргумента шаблона
- 30. C++ - <неразрешенный перегруженный тип функции>
Возможно, было бы удобнее использовать 'std :: result_of' вместо объявления' auto', а затем использовать 'decltype'. Имея больше вариантов и вариантов, в вашем распоряжении, всегда хорошо. –