Тип выражения лямбда 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 добавили некоторые).