I attempted to do refactoring by creating tuple from parameter pack It is successful. But I should unpack tuple to parameter pack again.... (because I should transfer argument as parameter pack form like below code) void testFunc(Args ... args) { auto tupleVar = make_tuple(args...); .......... auto lambdaF = [this, &tupleVar ] (int a) -> { auto bbb = bbbFunc(int q, forward<Arg>(args)...); }; } I tried to search for a way to unpack tuple to parameter pack However, there is a way to access each element, but there seems to be no way to use a tuple as a parameter pack. Is There any solution about this problem? If I can change the type for a parameter in function bbbFunc, I can define the function without using lambda expression and pass args... as argument form rather than capture block But it is not possible(I can't modify bbbFunc) I'm the author of https://gcc.gnu.org/pipermail/gcc-help/2021-September/140667.html. The code in this mail thread was simplified for the example. You said I could use a tuple, but it actually has to be applied to below code. [this, &args...](const MachineBasicBlock *MBB, const VarTy &, I will try to modify code by using tuple If It is failed, I will conclude this issue as gcc version issue. Thanks for answer On Wed, 1 Sept 2021 at 04:51, 김륜현 via Gcc-help <gcc-help@xxxxxxxxxxx> wrote: > > Dear sir, > > Hi, I tried to compile my source code using gcc-linaro-aarch64-linux-gnu-4.8-2013.09-01_linux(gcc 4.8.2) > > The error occurred like below > > lamb.cpp:5:19: error: expected ‘,’ before ‘...’ token > auto zzz = [&args...](int ccc) -> int { > ^ > lamb.cpp:5:19: error: expected identifier before ‘...’ token > lamb.cpp:5:22: error: parameter packs not expanded with ‘...’: > auto zzz = [&args...](int ccc) -> int { > ^ > lamb.cpp:5:22: note: ‘args’ > lamb.cpp: In instantiation of ‘struct solve(const int&, Args&& ...) [with Args = {}]::__lambda0’: > lamb.cpp:9:6: required from ‘void solve(const int&, Args&& ...) [with Args = {}]’ > lamb.cpp:15:10: required from here > lamb.cpp:5:15: error: using invalid field ‘solve(const int&, Args&& ...)::__lambda0::__args’ > auto zzz = [&args...](int ccc) -> int { > ^ > > Here, I attach the code > > #include <stdio.h> > > template <typename... Args> > void solve(const int &aa, Args &&... args) { > auto zzz = [&args...](int ccc) -> int { > int res = 1; > printf("%d",ccc); > return res + ccc; > }(10); > printf("zzz : %d\n",zzz); > } > > int main() > { > solve(10); > } > > > Solve function syntax refer to the template parameter pack "Args" as r-value. > And use "args" as a reference in the capture block of Lambda. > > Is It right? but, the compile error occurred. > > I think that this issue cause is that C++11 standard not implements this syntax in gcc 4.8 / implements in gcc 4.9 > Because I eventually changed the toolchain to gcc-linaro-4.9-2016.02-x86_64_aarch64-linux-gnu(gcc4.9.4) and Build was success.() > And when i searched this issue in http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html, this issue was mentioned in No.904 See https://gcc.gnu.org/pipermail/gcc-help/2021-September/140667.html > Is There workaround in gcc 4.8?(I want to change toolchain version. but, I should use gcc 4.8) You could create a tuple from the parameter pack and capture the tuple, but it will be awkward to access the elements. You should just use a newer compiler if you want to compile C++11 code.