c++11 - temporary objects with variadic template arguments; another g++/clang++ difference -
the following code
struct foo  {    foo ()     { }     template <typename t0, typename ... ts>       foo (const t0 & t0, const ts & ... ts)         { foo(ts...); }  };  int main()  {    foo f(1, 2);     return 0;  } compile without problems g++ (4.9.2) , give following errors
tmp_002-11,14,gcc,clang.cpp:9:16: error: expected ')'        { foo(ts...); }                ^ tmp_002-11,14,gcc,clang.cpp:9:13: note: match '('        { foo(ts...); }             ^ tmp_002-11,14,gcc,clang.cpp:9:14: error: redefinition of 'ts'            { foo(ts...); }              ^ tmp_002-11,14,gcc,clang.cpp:8:42: note: previous definition here       foo (const t0 & t0, const ts & ... ts)                                           ^ 2 errors generated. with clang++ (3.5).
as usual question is: who's right?
--- edit ---
clarification: know foo(ts...) can't call delegate constructor (i think can be) construction of temporary foo object (another foo object).
but, pointed vsoftco, what's happening when sizeof...(ts) == 1u?
in case, foo(ts...); (re)declaration of single variable ts (so, suppose, should right clang++) or variadic syntax avoid problem (so, suppose, should right g++)?
there c++11 standard experts can clarify this?
p.s.: sorry bad english.
this looks clang bug. here's minimal reproduction:
template <typename ... ts> void foo (ts ... ts) {     int(ts...); } (there's no need instantiate template).
judging error messages, clang interprets int(ts...); declaration, cannot be, because (ts...) cannot declarator.
one ask: when ts... parameter pack of size one, shouldn't parsed ts , cause whole construct interpreted declaration? answer no.
there syntactic ambiguity in c++ grammar between "declaration" , "expression-statement" productions. if ambiguous construct can parsed "declaration", "declaration". int(ts...) cannot parsed such, because grammar not have productions needed such parse. once construct classified expression statement, , not before that, can interpret ts... parameter pack , calculate sizeof...(ts). if construct not classified expression, sizeof...(ts) has no meaning @ all, because ts... has no meaning, such syntax cannot in declaration.
once established int(ts...); expression statement , not declaration, 1 may interpret , instantiate relevant templates , expand parameter packs. @ point it's late go , claim declaration along, based on fact sizeof...(ts) == 1. 1 not possibly deduce sizeof...(ts) == 1 if declaration (ts wouldn't parameter pack then).
moreover, clang seemingly insinuates not syntactically correct declaration. 1 cannot possibly derive facts sizeof...(ts) == 1 out of not syntactically correct. 
Comments
Post a Comment