Кажется, что 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 между ними, даже когда дело доходит до определения результата вызова функции.
Возможно, было бы удобнее использовать 'std :: result_of' вместо объявления' auto', а затем использовать 'decltype'. Имея больше вариантов и вариантов, в вашем распоряжении, всегда хорошо. –