Тип выражения лямбда gcc7 без стрелки

Я написал следующее случайно и не получил предупреждения с gcc 8:

auto f = []() bool {};

Я никогда не слышал и не читал ничего о предыдущем синтаксисе. Мое намерение заключалось в том, чтобы написать:

auto f = []() -> bool {};

И в этом случае gcc выдает очень полезное предупреждение, которое я ожидал: no return statement.

Я сделал несколько экспериментов, и GCC принимает первый синтаксис без предупреждений или ошибок, поскольку по крайней мере GCC 7.1, но не с GCC 6.3. Никакие другие компиляторы, похоже, не согласны с этим. Кроме того, первый синтаксис принимается для собственных типов: bool int float и таких, но не для классов, таких как struct A {};

Является ли это ошибкой или это новый синтаксис С++ 17 или С++ 20, связанный, например, с атрибутами?

Ответ 1

Кажется, это случайность. Код (но не предупреждения, как вы указываете) одинаковы для обоих, если у вас есть GCC 7 или 8. Но GCC 6 не принимает его, ни какой-либо другой компилятор, который я пробовал.

Он не действует C++. Он определенно не был добавлен для C++ 20, потому что GCC 7 не добавил никаких функций C++ 20 (хотя 8 добавили некоторые).