2013-05-05 18 views
15

Mi sono imbattuto in questo mentre compilavo del codice portatile in gcc. Fondamentalmente questo strano codice viene compilato in Visual Studio, che in realtà solo soffia la mia mente:Riferimento non costante associato a errore temporaneo di Visual Studio?

class Zebra {int x;}; 
Zebra goo() {Zebra z; return z;} 
void foo(Zebra &x) 
{ 
    Zebra y; 
    x = y; 
    foo(goo()); 
} 

Visual studio consente questa mosca. gcc prenderà questo come errore di compilazione. È interessante notare che, se digiti Zebra su int, VC++ si lamenterà. Comportamento abbastanza contraddittorio Pensieri?

+11

Non è un bug, è un'estensione del compilatore e malvagio. – chris

+1

MSVC ha l'avvertenza C4239: estensione non standard utilizzata, ma apparentemente l'avviso è disattivato. – MSalters

+2

Non vedo perché è necessario utilizzare una funzione infinitamente ricorsiva per dimostrarlo. – Neutrino

risposta

18

Questa è vecchia estensione a Visual Studio, l'unico riferimento che ho trovato sul sito di Microsoft è stato questo bug report: Temporary Objects Can be Bound to Non-Const References, che ha il seguente codice di esempio:

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 delle note risposte:

There is a level 4 warning (level 4 warning are enabled if you pass /W4 to the compiler) for it

questo post del blog: Visual C++ is so Liberal che copre questa estensione nota che:

Using Disable Language Extensions (/Za) makes it an error:

2

Come altri hanno detto, questo è dovuto all'estensione Microsoft C++. Anche se la bandiera /Za non è consigliata in quanto può rompere le cose.

Utilizzare invece lo switch /permissive- per una migliore conformità agli standard e si otterranno errori salutari per questi casi. Si noti che questo è disponibile a partire VS 2017.

The switch /Za does not support certain key Microsoft SDK header files. By contrast /permissive- offers a useful conformance mode where input C++ code is interpreted according to ISO C++ rules but also allows conforming extensions necessary to compile C++ on targets supported by Visual C++.

Maggiori informazioni è in Visual C++ Team Blog.

+0

Vale la pena notare che il flag '/ permissive' è disponibile da VS 2017. Potresti migliorare questa risposta includendo le citazioni pertinenti dell'articolo. Come quello che fa, perché è stato introdotto e la sua relazione con '/ Za' – bolov