¿Referencia no constante vinculada a un error temporal de Visual Studio?

Resuelto user805547 asked hace 11 años • 0 respuestas

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 studiodeja volar a este. gccdetectará esto como un error de compilación. Curiosamente, si escribe def Zebra en int, VC++se quejará. Comportamiento bastante contradictorio. ¿Pensamientos?

user805547 avatar May 05 '13 09:05 user805547
Aceptado

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:

Shafik Yaghmour avatar Dec 31 '2013 04:12 Shafik Yaghmour

Como dijeron otros, esto se debe a la extensión de Microsoft C++. Aunque /Zano 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++ .

Onur Gumus avatar Oct 23 '2017 08:10 Onur Gumus