W C ++ 11 istnieją dwie składnie deklaracji funkcji:
deklaracje typu zwracanego identyfikatora (
argumentów ... )
i
auto
identyfikator (
deklaracje-argumentów ... )
->
typ_powrotu
Są równoważne. Skoro są równoważne, dlaczego kiedykolwiek chcesz używać tych drugich? Cóż, C ++ 11 wprowadził tę fajną decltype
rzecz, która pozwala opisać typ wyrażenia. Więc możesz chcieć wyprowadzić typ zwracany z typów argumentów. Więc spróbuj:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
a kompilator powie ci, że nie wie, co a
i b
są w decltype
argumencie. Dzieje się tak, ponieważ są one deklarowane tylko przez listę argumentów.
Możesz łatwo obejść ten problem, używając declval
i parametrów szablonu, które są już zadeklarowane. Lubić:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
z wyjątkiem tego, że robi się teraz naprawdę rozwlekły. Tak więc alternatywna składnia deklaracji została zaproponowana i zaimplementowana, a teraz możesz pisać
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
i jest mniej szczegółowy, a zasady określania zakresu nie musiały się zmieniać.
Aktualizacja C ++ 14: C ++ 14 również pozwala tylko
auto
identyfikator (
deklaracji argumentów ... )
o ile funkcja jest w pełni zdefiniowana przed użyciem, a wszystkie return
instrukcje wywodzą się z tego samego typu. ->
Składnia pozostaje użyteczna dla funkcji publicznych (zadeklarowane w nagłówku), jeśli chcesz, aby ukryć ciało w pliku źródłowym. W pewnym sensie nie można tego zrobić za pomocą szablonów, ale istnieją pewne konkretne typy (zwykle uzyskiwane za pomocą metaprogramowania szablonów), które są trudne do napisania w inny sposób.