2010-11-22 8 views
35

Ich legte die öffnende Klammer meiner Funktionsdefinition versehentlich nach der return-AnweisungWarum sagt GCC "benannte Rückgabewerte nicht mehr unterstützt"?

int id(int k) return k; { } 

Aber GCC mit einer seltsamen Fehlermeldung beantwortet

error: named return values are no longer supported

Kann jemand bitte erklären, was das seltsame Feature sein könnte? Ich habe noch nie davon gehört.

+0

vielleicht einige frühe Implementierung von NRVO, wo mussten Sie die Variable benennen, um es zu bekommen, die Kopie zu elide? –

+0

Go hat Ergebnisparameter benannt, http://golang.org/doc/effective_go.html – u0b34a0f6ae

Antwort

37

Siehe here - frühe NRVO-Implementierung durch explizite Definition des benannten Rückgabewerts im Funktionskopf.

Native Unterstützung für NRVO ohne diese Erweiterung wurde hinzugefügt here - GCC 3.1 Release Series.

Kurz geschnitten und für den Kontext einzufügen:

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, das ist verrückt. Danke für die Antwort. –

+0

NRVO ist ein Thema nach meinem Herzen nach einer langen Zeit zu versuchen, herauszufinden, warum das Heck VC++ 7.1 (das ist das letzte Microsoft C++ keine NRVO zu haben) ist so langsam, wenn große "Vektor" Ergebnisse zurückgibt ... –

+0

isn Gibt es auch etwas in VC++ 2008 wie kein NRVO in Debug-Builds? –

Verwandte Themen