Подтвердить что ты не робот

Неконстантная ссылка связана с временной ошибкой Visual Studio?

Я столкнулся с этим, компилируя переносимый код в gcc. В основном этот странный код компилируется в 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++ будет жаловаться. Довольно противоречивое поведение. Мысли?

4b9b3361

Ответ 1

Это старое расширение для Visual Studio, единственной ссылкой, которую я мог найти на сайте Microsoft, был этот отчет об ошибке: Временные объекты могут быть привязаны к ссылкам без ссылок, который имеет следующий пример кода:

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

Один из комментариев:

Существует предупреждение уровня 4 (предупреждение уровня 4 включено, если вы передаете /W 4 компилятору) для него

Это сообщение в блоге: Visual С++ является настолько либеральным, который охватывает это расширение, что:

Использование отключенных языковых расширений (/Za) делает ошибку:

Ответ 2

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

Вместо этого используйте переключатель /permissive- для лучшего соответствия стандартам, и вы получите здоровые ошибки для этих случаев. Обратите внимание, что этот флаг доступен с VS 2017.

Коммутатор/Za не поддерживает определенные файлы заголовков Microsoft SDK. В противоположность этому /permissive - предлагает полезный режим соответствия, где ввод кода С++ интерпретируется в соответствии с правилами ISO С++, а также позволяет соответствовать расширениям, необходимым для компиляции С++ для целей, поддерживаемых Visual С++.

Дополнительная информация находится на Visual С++ Team Blog.