2010-11-22 26 views
35

je accidentellement mis le n'importe qui attelle de ma définition de la fonction d'ouverture après la déclaration de retourPourquoi GCC dit-elle que "les valeurs de retour nommées ne sont plus supportées"?

int id(int k) return k; { } 

Mais GCC a répondu avec un message d'erreur bizarre

error: named return values are no longer supported

peut s'il vous plaît expliquer ce que caractéristique bizarre peut-être? Je n'en ai jamais entendu parler.

+0

peut-être une première implémentation de NRVO où vous deviez nommer la variable pour l'obtenir pour élider la copie? –

+0

Go a nommé les paramètres de résultats, http://golang.org/doc/effective_go.html – u0b34a0f6ae

Répondre

37

Voir here - implémentation NRVO précoce par définition explicite de la valeur de retour nommée dans l'en-tête de la fonction.

Le support natif pour NRVO sans cette extension a été ajouté here - GCC 3.1 Release Series.

Brève coupure et coller pour le contexte:

G++ now supports the "named return value optimization": for code like

A f() { 
    A a; 
    ... 
    return a; 
} 

G++ will allocate a in the return value slot, so that the return becomes a no-op. For this to work, all return statements in the function must return the same variable.

+0

Wow c'est fou. Merci d'avoir répondu. –

+0

NRVO est un sujet proche de mon coeur après avoir passé beaucoup de temps à essayer de comprendre pourquoi le VC++ 7.1 (qui est le dernier Microsoft C++ à ne pas avoir de NRVO) est si lent lors du retour de grands résultats vectoriels ... –

+0

isn Y at-il aussi quelque chose dans VC++ 2008 comme pas de NRVO dans les versions de débogage? –