Consider this piece of code:
template < auto What >
constexpr auto Identity = [](auto&&...) { return What; };
struct Ban
{
Ban() = default;
Ban(const Ban& ban) = delete;
Ban( Ban&& ban) = delete;
};
int main()
{
Ban ban;
Identity<false>(10,ban);
return 0;
}
This fails to compile on godbolt.org with gcc-7.3 as it tries to copy the second argument of Identity. Why it should? Is this a bug in gcc?
gcc does not complain if the second argument is a temporary or when there is only one argument. It complains for only one argument when the definition of Identity is with (...) instead of (auto&&...).
The first half is a mis-parse of
auto&&...for generic lambdas in older GCC versions: clang vs gcc - empty generic lambda variadic argument pack; Should non-capturing generic lambdas decay to function pointers?; Should non-capturing generic lambdas decay to function pointers?The second half is expected. Passing over C-style
...variadics makes a copy and you deleted your copy constructor.