Folgendes:
%Vor%gibt einen Fehler im C ++ 11-Modus mit Clang:
error: 'auto' gibt ohne abschließenden Rückgabetyp zurück; abgeleitete Rückkehr Typen sind eine C ++ 14-Erweiterung
kompiliert jedoch im C ++ 14-Modus. GCC kompiliert in beiden Modi mit -Wall -Wextra -pedantic
, ohne sich zu beschweren.
n3337 7.1.6.4/2 sagt:
Der automatische Typspezifizierer kann mit einem Funktionsdeklarator angezeigt werden trailing-return-type (8.3.5) in jedem Kontext, in dem sich ein solcher Deklarator befindet gültig.
8.3.5p2 spricht über Funktionsdeklaratoren, aber ich bin zu unerfahren, um es herauszufinden. Kann jemand erklären, wenn es in C ++ 11 legal ist?
Dies wird teilweise durch CWG 1725 abgedeckt:
Die Behandlung einer Erklärung wie der folgenden ist nicht klar:
%Vor%8.3.5 [dcl.fct] In Absatz 2 muss der Typ des verschachtelten Deklarators bestimmt werden.
%Vor%was, weil es kein a hat trailing-return-type, würde von (C ++ 11) 7.1.6.4 schlecht gebildet werden [dcl.spec.auto]. (In C ++ 14, ein automatischer Rückgabetyp ohne a trailing-return-type ist natürlich erlaubt.)
Begründung (September 2013): Die Absicht des C ++ 11-Wortlauts besteht darin, dass die Anforderung für einen nachgestellten Rückgabetyp nur auf der obersten Ebene des Deklarators gilt, auf die auto angewendet wird, nicht auf jede mögliche rekursive Stufe in der Deklaratorverarbeitung. [..]
Außerdem, [dcl.fct] / 2 ,
In einer Deklaration
hatT D
wobeiD
die Form
D1
(
Parameterdeklarationsklausel)
[...] Nachschlagetypund der Typ der enthaltenen deklarator-ID in der Deklaration
T D1
ist " abgeleitete Deklarator-Typ-ListeT
" ,T
soll der einzelne Typspezifiziererauto
sein.
Wie im DR erwähnt, ist T D1
auto (*f())
, das vom Typ "Funktion von ()
ist, der Zeiger auf auto
zurückgibt" (d. h. die Anforderung erfüllt). Daher ist Ihr Code sowohl in C ++ 11 als auch in 14 gültig, und der Typ von f
ist "Funktion von ()
, der Zeiger auf die Funktion von ()
returning int
" zurückgibt.
Tags und Links c++ c++11 language-lawyer trailing-return-type