Делает ли decltype (auto) устаревший конечный тип возврата? - PullRequest
3 голосов
/ 19 сентября 2019

Было много , много , много вопросов и ответов относительно конечного типа возврата , auto вычета типа возвратаи очень полезный decltype(auto).Но мне не удалось найти ответ на вопрос, нужен ли конечный тип возврата для всех для всех , поскольку у нас есть decltype(auto).Существуют ли случаи, когда завершающий тип возвращаемого значения решается, когда decltype(auto) либо не может использоваться, либо не работает (дает неожиданные / неверные результаты) и в первую очередь требовался конечный тип возврата?

Ответы [ 2 ]

6 голосов
/ 19 сентября 2019

Тривиальным примером может быть ситуация, когда вы хотите вызвать функцию до того, как она будет определена, и будет возвращен тип:

decltype(auto) bar(); // doesn't help

decltype(auto) foo() { bar(); } // error: returned type of `bar` is unknown

decltype(auto) bar() { foo(); }
5 голосов
/ 19 сентября 2019

decltype(auto) (и, как правило, выводимый тип возврата) и конечный тип возврата являются ортогональными элементами.

Вы можете иметь:

  • decltype(auto) f() {}
  • auto f() -> decltype(auto) {}

Конечный тип возврата

Конечный тип возврата - это хорошо, особенно если иметь доступ к контексту, которого у нас нет до имени функции

  • как для шаблона:

    template <typename T>
    auto f(T x) -> decltype(bar(x));
    

    против

    template <typename T>
    decltype(bar(std::declval<T&>())) f(T x);
    
  • или для зависимого имени в классе:

    auto C::begin() -> iterator;
    

    против

    C::iterator C::begin();
    

Единственное место, где это требуется, - лямбда (если вы хотите / хотите явно указать тип возвращаемого значения):

  • []() -> some_type {/*...*/}
  • []() -> auto {/*...*/} (что эквивалентно []() {/*...*/})
  • []() -> decltype(auto) {/*...*/}

Случай, когда мы должны определить тип возврата лямбды, это когда он должен возвращатьсяссылочный тип.

выведенный тип возврата

Завершено с decltype(auto) и auto.

decltype(auto) и auto Тип удержания отличается, в основном как T&&и T.

Выведенный тип возврата требует определения тела.

Они также не допускают SFINAE, так как нет замены .

...