2013-05-05 26 views
15

Wpadłem na to podczas kompilowania jakiegoś przenośnego kodu w gcc. Zasadniczo ten dziwny kod kompiluje w Visual Studio, które tak naprawdę wieje zdanie:Niezwiązana referencja związana z tymczasowym błędem Visual Studio?

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

Visual studio pozwala tę jedną muchę. gcc wykryje to jako błąd kompilacji. Co ciekawe, jeśli typedef Zebra do int, VC++ będzie skarżyć. Dość sprzeczne zachowanie. Myśli?

+11

To nie jest błąd, to rozszerzenie kompilatora i zły. – chris

+1

MSVC ma "ostrzeżenie C4239: niestandardowe rozszerzenie używane", ale najwyraźniej masz to ostrzeżenie wyłączone. – MSalters

+2

Nie widzę powodu, dla którego musisz użyć funkcji nieskończonej rekursji, aby to demonstrować. – Neutrino

Odpowiedz

18

Jest to stary rozszerzenie do Visual Studio, jedyne odniesienie mogłem znaleźć na stronie Microsoft był to raport o błędzie: Temporary Objects Can be Bound to Non-Const References, który ma następujący przykładowy kod:

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

jedną z odpowiedzi notach:

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

Ten blogu: Visual C++ is so Liberal który obejmuje to rozszerzenie zauważa, że:

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

2

Jak powiedzieli inni, jest to spowodowane rozszerzeniem Microsoft C++. Chociaż flaga /Za nie jest zalecana, ponieważ może spowodować błędy.

Zamiast tego użyj przełącznika /permissive-, aby uzyskać lepszą zgodność z normami, a otrzymasz zdrowe błędy w tych przypadkach. Zauważ, że ta flaga jest dostępny od 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++.

Więcej informacji znajduje się na Visual C++ Team Blog.

+0

Warto zauważyć, że flaga '/ permissive' jest dostępna od VS 2017. Można poprawić tę odpowiedź, umieszczając odpowiednie cytaty z artykułu. Podobnie jak to, co się dzieje, dlaczego został wprowadzony i jego związek z '/ Za' – bolov