¿Referencia no constante vinculada a un error temporal de Visual Studio?
Me encontré con esto mientras compilaba un código portátil en gcc
. Básicamente, este código extraño se compila en Visual Studio, lo que realmente me deja boquiabierto:
class Zebra {int x;};
Zebra goo() {Zebra z; return z;}
void foo(Zebra &x)
{
Zebra y;
x = y;
foo(goo());
}
Visual studio
deja volar a este. gcc
detectará esto como un error de compilación. Curiosamente, si escribe def Zebra en int, VC++
se quejará. Comportamiento bastante contradictorio. ¿Pensamientos?
Esta es una extensión antigua de Visual Studio, la única referencia que pude encontrar en el sitio de Microsoft fue este informe de error: Los objetos temporales pueden vincularse a referencias no constantes , que tiene el siguiente código de ejemplo:
struct A {};
A f1();
void f2(A&);
int main()
{
f2(f1()); // This line SHALL trigger an error, but it can be compiled without any errors or warnings.
}
Una de las respuestas señala:
Hay una advertencia de nivel 4 (las advertencias de nivel 4 están habilitadas si pasa /W4 al compilador) para ello
Esta publicación de blog: Visual C++ es tan liberal que cubre esta extensión señala que:
El uso de Desactivar extensiones de idioma (/Za) genera un error:
Como dijeron otros, esto se debe a la extensión de Microsoft C++. Aunque /Za
no se recomienda la bandera ya que puede romper cosas.
En su lugar, utilice el /permissive-
interruptor para un mejor cumplimiento de los estándares y obtendrá errores saludables en estos casos. Tenga en cuenta que esta bandera está disponible desde VS 2017.
El modificador /Za no admite ciertos archivos de encabezado clave del SDK de Microsoft. Por el contrario, /permissive- ofrece un modo de conformidad útil donde el código C++ de entrada se interpreta de acuerdo con las reglas ISO C++ pero también permite la conformidad de las extensiones necesarias para compilar C++ en objetivos compatibles con Visual C++.
Hay más información en el blog del equipo de Visual C++ .