2016-05-27 5 views
8

qui suit:Ce type de retour arrière est-il légal en C++ 11?

auto (*f())() -> int; 

donne une erreur en mode C 11 avec Clang disant:

error: 'auto' return without trailing return type; deduced return types are a C++14 extension

mais compilera en mode 14 C++. GCC compile sans se plaindre dans les deux modes avec -Wall -Wextra -pedantic.

n3337 7.1.6.4/2 dit:

The auto type-specifier may appear with a function declarator with a trailing-return-type (8.3.5) in any context where such a declarator is valid.

8.3.5p2 parle de la fonction déclarateurs mais je suis trop inexpérimenté pour comprendre. Quelqu'un peut-il expliquer si c'est légal dans C++ 11?

+1

Essayez-vous de spécifier un type de retour arrière pour le pointeur de fonction 'f' renvoie? – user2357112

+0

Je suppose que GCC a raison de le compiler. Clang de Coliru et GCC disent tous deux que c'est un int (* (*)())() '. – chris

+4

Indépendamment du fait que la norme l'autorise, c'est aussi un bogue de compilateur. Un message d'erreur indiquant qu'un type de retour final est omis lorsqu'un type de retour final est présent est un message d'erreur incorrect. – hvd

Répondre

3

Ceci est en partie couverte par CWG 1725:

The treatment of a declaration like the following is not clear:

auto (*f())() -> int; // #1 

8.3.5 [dcl.fct] paragraph 2 appears to require determining the type of the nested declarator

auto (*f()); // #2 

which, because it does not have a trailing-return-type, would be ill-formed by (C++11) 7.1.6.4 [dcl.spec.auto]. (In C++14, an auto return type without a trailing-return-type is, of course, permitted.)

Rationale (September, 2013): The intent of the C++11 wording is that the requirement for a trailing return type applies only at the top level of the declarator to which auto applies, not to each possible recursive stage in the declarator processing. [..]

En outre, selon [dcl.fct]/2,

In a declaration T D where D has the form

      D1 (parameter-declaration-clause) [...] trailing-return-type

and the type of the contained declarator-id in the declaration T D1 is “derived-declarator-type-listT, T shall be the single type-specifierauto .

Comme mentionné dans le DR, T D1 est auto (*f()), qui est du type « fonction de () retour pointeur vers auto "(ie correspond à l'exigence). Par conséquent votre code est valide dans C++ 11 et 14, et le type de f est "la fonction de () retournant le pointeur à la fonction de () renvoyant int".