// P0624R2 // { dg-do compile { target c++11 } } #if __cplusplus >= 201402L #define A auto #else #define A int #endif void f1 () { auto greater = [](A x, A y) { return x > y; }; // { dg-message "a lambda closure type has a deleted (default constructor|copy assignment operator)" "" { target c++17_down } } decltype (greater) gt; // { dg-error "use of deleted function" "" { target c++17_down } } gt = greater; // { dg-error "use of deleted function" "" { target c++17_down } } } void f2 () { auto greater = [&](A x, A y) { return x > y; }; // { dg-message "a lambda closure type has a deleted (default constructor|copy assignment operator)" } decltype (greater) gt; // { dg-error "use of deleted function" } gt = greater; // { dg-error "use of deleted function" } } void f3 () { auto greater = [=](A x, A y) { return x > y; }; // { dg-message "a lambda closure type has a deleted (default constructor|copy assignment operator)" } decltype (greater) gt; // { dg-error "use of deleted function" } gt = greater; // { dg-error "use of deleted function" } } void f4 (int i) { auto greater = [i](A x, A y) { return x > y; }; // { dg-message "a lambda closure type has a deleted (default constructor|copy assignment operator)" } decltype (greater) gt; // { dg-error "use of deleted function" } gt = greater; // { dg-error "use of deleted function" } } #if __cplusplus > 201703L void f5 () { auto greater = [](auto x, auto y) constexpr { return x > y; }; decltype (greater) gt; static_assert (!gt (1, 2)); static_assert (gt (4, 3)); static_assert (!gt (3.5, 3.75)); static_assert (gt (3.5, 3.25)); gt = greater; static_assert (!gt (1, 2)); static_assert (gt (4, 3)); static_assert (!gt (3.5, 3.75)); static_assert (gt (3.5, 3.25)); } #endif