c++ - ¿Referencia no relacionada con temporal, error de Visual Studio?
visual-studio temporary-objects (2)
Esta es la antigua extensión 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 las 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 notas de respuestas:
Hay una advertencia de nivel 4 (advertencia de nivel 4 habilitada si pasa / W4 al compilador) para ello
Esta publicación en el blog: Visual C ++ es tan liberal que cubre estas notas de extensión que:
Usar Deshabilitar Extensiones de Idioma (/ Za) lo convierte en un error:
Me encontré con esto mientras compilaba un código portátil en gcc
. Básicamente, este extraño código 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 este. gcc
detectará esto como un error de compilación. Curiosamente, si escribedef Zebra en int, VC++
se quejará. Comportamiento bastante contradictorio. ¿Pensamientos?
Como otros dijeron, esto se debe a la extensión Microsoft C ++. Aunque /Za
flag no es recomendable ya que puede romper cosas.
En su lugar, utilice el interruptor /permissive-
para cumplir mejor los estándares y obtendrá errores saludables para estos casos. Tenga en cuenta que esta bandera está disponible desde VS 2017.
El interruptor / Za no admite ciertos archivos de encabezado de Microsoft SDK clave. Por contraste / permisivo: ofrece un modo de conformidad útil donde el código de entrada C ++ se interpreta según las reglas de ISO C ++, pero también permite las extensiones de conformidad necesarias para compilar C ++ en los destinos compatibles con Visual C ++.
Más información está en Blog de equipo de Visual C ++ .