2013-05-05 3 views
15

Я столкнулся с этим, компилируя какой-нибудь портативный код в gcc. В основном этот странный код компилируется в Visual Studio, которая на самом деле просто взрывает мой разум:Ссылка на несвязанные ссылки на временную ошибку Visual Studio?

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

Visual studio позволяет это один муху. gcc поймает это как ошибку компиляции. Интересно, если вы напечатаете Zebra до int, VC++ будет жаловаться. Довольно противоречивое поведение. Мысли?

+11

Это не ошибка, это расширение для компилятора и злой. – chris

+1

MSVC имеет «предупреждение C4239: используется нестандартное расширение», но, похоже, вы отключили это предупреждение. – MSalters

+2

Я не понимаю, почему вам нужно использовать бесконечно рекурсирующую функцию для демонстрации этого. – Neutrino

ответ

18

Это старое расширение Visual Studio, только ссылка, которую я мог бы найти на сайте Microsoft был этот отчет об ошибке: Temporary Objects Can be Bound to Non-Const References, которая имеет следующий пример кода:

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

Один из нот отзывы:

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

этот блог: Visual C++ is so Liberal который покрывает это расширение отмечает, что:

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

2

Как говорили другие, это связано с расширением Microsoft C++. Хотя флаг /Za не рекомендуется, так как он может сломать вещи.

Вместо этого используйте переключатель /permissive- для лучшего соответствия стандартам, и вы получите здоровые ошибки для этих случаев. Обратите внимание, что этот флаг доступен в 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++.

Больше информации на Visual C++ Team Blog.

+0

Возможно, стоит отметить, что флаг '/ permissive' доступен с VS 2017. Вы можете улучшить этот ответ, включив соответствующие цитаты из статьи. Как то, что делает, почему было введено и его связь с '/ Za' – bolov