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

19

Решение

Это старое расширение для 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 включено, если вы передаете / W4 компилятору) для него

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

Использование Disable Language Extensions (/ Za) приводит к ошибке:

19

Другие решения

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

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

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

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

3

По вопросам рекламы [email protected]