В C++ незаконно преобразовывать значение rvalue в ссылку lvalue. Рассмотрим следующий код, где именующее ссылка привязана к RValue (лямбда):Ссылка rvalue и lvalue с лямбда-выражениями - gcc vs. msvc
int main()
{
auto& f = []() -> void {};
return 0;
}
GCC (4.8.1) не принимает такой код (имеет смысл). Тем не менее, компилятор Microsoft принимает это, означая, что либо он принимает нестандартный код, либо C++ разрешает конкретный случай, когда ссылка lvalue привязана к lambda-выражению rvalue.
Вопрос: какое предположение верно?
Да, это особенность. Иногда это полезно. У нас есть вопрос/ответ где-то, что объясняет это? –
@MartinBa: В ответ на оба ваших комментария, что-либо вне стандарта, IMHO, не функция, а ошибка. C++ не идеален, но «усовершенствования» для конкретного поставщика - это PITA, когда дело доходит до функциональной совместимости, и их следует убивать огнем. YMMV (но когда вы начинаете работать над кросс-платформенными проектами, это становится очень важным). – syam
@syam: Большое количество специфических для поставщика расширений. Никто не мог получить нигде без API-интерфейсов, специфичных для ОС. – Puppy