Недавно я работал с другом, который хотел сделать С++ более Haskell-y, и нам нужна функция, которая в основном выглядит так:
auto sum(auto a, auto b) {
return a + b;
}
По-видимому, я не могу использовать auto как тип параметра, поэтому я изменил его на это:
template<class A, class B>
auto sum(A a, B b) {
return a + b;
}
Но это тоже не работает. Что мы в конце концов поняли, нам нужно это:
template<class A, class B>
auto sum(A a, B b) -> decltype(a + b) {
return a + b;
}
Итак, мой вопрос в том, какой смысл? Разве не decltype
просто повторять информацию, так как компилятор может просто посмотреть на оператор return?
Я подумал, что, возможно, это необходимо, поэтому мы можем просто включить заголовочный файл:
template<class A, class B>
auto sum(A a, B b) -> decltype(a + b);
... но мы все равно не можем использовать такие шаблоны.
Другая вещь, которую я рассматривал, заключалась в том, что компилятор может быть проще, но похоже, что на самом деле это будет сложнее.
Случай 1: с decltype
- Выясните тип оператора
decltype
- Выясните типы возвращаемых значений
- Посмотрите, соответствуют ли они
Случай 2: Без decltype
- Выясните типы возвращаемых значений
- Посмотрите, соответствуют ли они
Итак, с учетом этих вещей, какая точка возвращаемого возвращаемого типа с decltype
?