https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87384

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|---                         |INVALID

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jan Engelhardt from comment #0)
> $ cat x.cpp
> void (*f)(const char *, int &&...);
> void g(const char *, int &&a, int &&b) {}
> int main() { f = g; return 0; }
> 
> OBSERVED:
> $ g++-8 -c x.cpp
> x.cpp: In function ‘int main()’:
> x.cpp:3:18: error: invalid conversion from ‘void (*)(const char*, int&&,
> int&&)’ to ‘void (*)(const char*, int&&, ...)’ [-fpermissive]
>  int main() { f = g; return 0; }
> 
> EXPECTED:
> That "int &&..." be reported as a syntax error of some kind. An argument
> pack is normally only viable with a template, isn't it.

That's not a template parameter pack, it's a printf-style variadic function.
The comma before the ... is optional, so your code means exactly the same as:

void (*f)(const char *, int &&, ...);
void g(const char *, int &&a, int &&b) {}
int main() { f = g; return 0; }

And indeed that's exactly what the error message tells you.

Reply via email to