2009-08-28 8 views
9

Tengo el siguiente códigoBinding temporal a una referencia lvalue

string three() 
{ 
    return "three"; 
} 

void mutate(string& ref) 
{ 
} 

int main() 
{ 
    mutate(three()); 
    return 0; 
} 

Se puede ver que estoy pasando tres() a método mutan. Este código compila bien. Según entiendo, los temporales no se pueden asignar a referencias no const. En caso afirmativo, ¿cómo se está compilando este programa?

¿Alguna idea?

Editar:

compiladores trataron: VS 2008 y VS2010 Beta

+0

Pruebe GCC es más cercano al estándar C++. – Learner

+0

Lamentablemente, no tengo GCC conmigo. –

+0

@Appu: Después de haber corregido el código para los prefijos 'std' y faltantes, Comeau (http://www.comeaucomputing.com/tryitout/) dice:' el valor inicial de la referencia a non-const debe ser un valor l'. La razón por la que VC acepta esto es porque VC está roto. (Lo llaman una "característica", pero en realidad es un error). – sbi

Respuesta

8

Solía ​​compilar en el compilador VC6, así que supongo que para mantener la comptibilidad hacia atrás VS2008 admite esta extensión no estándar. Pruebe con el indicador /Za (deshabilitar extensión de idioma), entonces debería obtener un error.

+0

¡Genial! Ahora funciona. –

+0

Especificar la opción '/ Za' podría causar problemas al incluir' windows.h' u otros encabezados específicos de Windows. –

+5

Usando el nivel de Advertencia como cuatro es la mejor opción que es la que usé – yesraaj

1

Se no de compilación, con g ++ 4 al menos:

foo.cpp: In function ‘int main()’: 
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’ 
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’ 

(Los números de línea son apagado por 3 o 4, porque tuve que agregar las líneas #include y 'using'.)

Entonces, su compilador parece no ser tan estricto como debería ser.

+0

Publicación editada y compiladores adicionales que estoy usando. –

0

Supongo que depende del compilador. g ++ 4.1.2 me da esto.

In function 'int main()': 
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string' 
compilation terminated due to -Wfatal-errors. 

Tal vez porque no está haciendo nada, la llamada se optimiza.

+0

Intenté hacer algo con el parámetro ref dentro del método mutate() y todavía compila –

+0

Lo intenté en VC++ ahora mismo y se compila y funciona a menos que deshabilite extensiones en las propiedades del proyecto. Cuando lo haces, obtienes esto: 1> main.cpp 1> d: \ all \ projects \ laptop \ 2 \ asd \ asd \ main.cpp (16): error C2664: 'mutate': no ​​se puede convertir el parámetro 1 de 'std :: string' a 'std :: string &' 1> Una referencia no constante solo puede estar vinculada a un lvalue –

3

Esta es una extensión de Microsoft, para imitar el comportamiento de muchos otros compiladores de Microsoft. Si habilita las advertencias W4, verá la advertencia.

Cuestiones relacionadas