2017-02-22 11 views
1

Кажется, что C++ 14 auto ключевое слово может отображаться в месте определения функции для указания типа возврата. В этом случае требуется std::result_of? Разве это не устарело сейчас?C++ 14 'auto' может получить возвращаемый тип функции, нам все еще нужен std :: result_of <>?

+0

Возможно, было бы удобнее использовать 'std :: result_of' вместо объявления' auto', а затем использовать 'decltype'. Имея больше вариантов и вариантов, в вашем распоряжении, всегда хорошо. –

ответ

5

Да, абсолютно.

  1. Иногда требуется тип возврата, но не как результат функции. Предположим, у меня есть 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 не будет его обрезать.

  2. 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() будет просто удален из набора перегрузки. Это может быть очень ценным в общем коде, так как вы можете тестировать выражения для корректности.

  3. Аннотация. auto ничего не говорит о возвращаемом типе функции. Если функция возвращает результат вызова одного вызываемого с некоторыми аргументами, std::result_of_t<F(A, B)> сам по себе сообщает мне, что делает эта функция. auto ничего мне не говорит.


Действительно лучший вопрос может быть ... зачем нам std::result_of если мы имеем decltype. Они кажутся более близкими. В конце концов, я могу сделать decltype(x+1), как я могу выразить это с точки зрения result_of?! decltype явно лучше. Ну, оказывается, есть some slight differences между ними, даже когда дело доходит до определения результата вызова функции.

Смежные вопросы