Natknąłem się na następujący kod:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Nie mogę zrozumieć jednej rzeczy:
Gdzie mogę się dowiedzieć, co oznacza operator strzałki ( ->
) w nagłówku funkcji? Myślę, że czysto logicznie, że ->
operator określa typ, do którego auto
zostanie wydedukowany, ale chcę to wyjaśnić. Nie mogę znaleźć żadnych informacji.
Odpowiedzi:
W C ++ 11 istnieją dwie składnie deklaracji funkcji:
deklaracje typu zwracanego identyfikatora
(
argumentów ...)
i
auto
identyfikator(
deklaracje-argumentów ...)
->
typ_powrotuSą 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:a kompilator powie ci, że nie wie, co
a
ib
są wdecltype
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ć: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ć
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.źródło
C++14
gdy używamauto
doreturn
pisania w takiej funkcji bez potrzeby-> decltype(a + b)
części. Czy jest już zbędny, czy ma inne przypadki, w których nadal powinien być używany? czy jest to rozszerzenie specyficzne dla kompilatora?auto
, bez->
notacji, o ile funkcja jest w pełni zdefiniowana przed użyciem, a wszystkiereturn
instrukcje są dedukowane do tego samego typu.->
Notacja jest nadal przydatna, jeśli chcesz korzystać z odliczenia dla funkcji publicznej, ukrywając ciało w pliku źródłowym.W prostym języku angielskim mówi, że typ zwracany jest wywnioskowanym typem sumy
a
ib
.źródło