Неконстантная ссылка связана с временной ошибкой 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++
будет жаловаться Довольно противоречивое поведение. Мысли?
2 ответа
Это старое расширение для 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) приводит к ошибке:
Как говорили другие, это связано с расширением Microsoft C++. Хоть /Za
Флаг не рекомендуется, поскольку он может сломать вещи.
Вместо этого используйте /permissive-
Переключитесь на соответствие стандартам, и вы получите здоровые ошибки в этих случаях. Обратите внимание, что этот флаг доступен с VS 2017.
Параметр /Za не поддерживает некоторые ключевые заголовочные файлы Microsoft SDK. В отличие от этого /permissive- предлагает полезный режим соответствия, в котором входной код C++ интерпретируется в соответствии с правилами ISO C++, но также позволяет соответствующие расширения, необходимые для компиляции C++ в целях, поддерживаемых Visual C++.
Больше информации на Visual C++ Team Blog.