2010-11-22 8 views
35

accidentalmente puse la llave de apertura de mi definición de la función después de la instrucción de retorno¿Por qué GCC dice "los valores de devolución nombrados ya no son compatibles"?

int id(int k) return k; { } 

Pero GCC respondió con un mensaje de error raro

error: named return values are no longer supported

Puede alguien por favor explique cuál podría ser esa característica extraña? Nunca he oído hablar de eso.

+0

¿Alguna implementación temprana de NRVO en la que tuvo que nombrar la variable para eliminarla? –

+0

Go ha nombrado parámetros de resultados, http://golang.org/doc/effective_go.html – u0b34a0f6ae

Respuesta

37

Véase here - implementación temprana de NRVO por definición explícita del valor de retorno con nombre en el encabezado de la función.

Se ha agregado soporte nativo para NRVO sin esta extensión here - GCC 3.1 Release Series.

Breve cortar y pegar para el contexto:

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, eso es una locura. Gracias por la respuesta. –

+0

NRVO es un tema cercano a mi corazón después de pasar un largo tiempo tratando de averiguar por qué el diablo VC++ 7.1 (que es el último Microsoft C++ que no tiene NRVO) es tan lento al devolver resultados grandes de 'vector' ... –

+0

isn ¿Hay también algo en VC++ 2008 como no NRVO en compilaciones de depuración? –

Cuestiones relacionadas