c++ visual-studio temporary-objects

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 ++ .