Ist dieser nachgestellte Rückgabetyp in C ++ 11 zulässig?

8

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?

    
John Cena 27.05.2016, 23:45
quelle

1 Antwort

3

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 T D wobei D die Form

hat      

D1 ( Parameterdeklarationsklausel ) [...] Nachschlagetyp

     

und der Typ der enthaltenen deklarator-ID in der Deklaration T D1 ist " abgeleitete Deklarator-Typ-Liste T " , T soll der einzelne Typspezifizierer auto 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.

    
Columbo 29.05.2016 19:37
quelle