C++:lambda中的参数包扩展失败

tly*_*tly 5 c++ lambda variadic-templates c++14

我正在尝试创建一种直接扩展多个参数包的方法.我创建了一个函数template<size_t X,typename F> auto sequenceFunc(F&& f),f用扩展函数调用给定的函数integer_sequence.

这适用于这样的小功能:

template<typename T,
         size_t A,size_t B>
vec<B,T> col(const mat<A,B,T>& a,const size_t& i){
    return sequenceFunc<A>([&](auto... J) -> vec<B,T>{
        return { a[J][i]... }; //expands to a[0][i], a[1][i], ... a[A-1][i]
    });
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,即使遵循规则,我也无法扩展多个参数包,只有一个参数包可以在...-expression中.这是我尝试使用此函数进行矩阵乘法:

template<typename S,typename T,
         size_t A,size_t B,size_t C>
mat<C,B,S> mul(const mat<A,B,S>& a,const mat<C,A,T>& b){
    return sequenceFunc<B>([&](auto... I)->mat<C,B,S>{ //for all B rows in a...
        return {
            sequenceFunc<C>([&](auto... J)->vec<C,S>{ // ... look at all C columns in b and calculate dot product.
                auto i = I; //putting "I" outside the expansion of "J"
                return {
                    dot(row(a,i),col(b,J))... //expands J
                };
            })... //expands I
        };
    });
}
Run Code Online (Sandbox Code Playgroud)

这是错误:

error: parameter packs not expanded with '...':
      auto i = I;
               ^
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么扩展是必要的,因为...表达之外还有另一个扩展.我使用GCC 5.1.0.

信息 vec,mat只是 - 嵌套的using声明std::array和嵌套std::array<std::array<A,T>,B>

Bar*_*rry 4

这是gcc bug 47226。它仍然是打开的,代码示例在 gcc 5.2.0 上仍然失败,而它在 clang 3.6 上编译得很好。你的代码对我来说看起来是正确的。

  • @Yakk Naw 肯定有办法做我想做的事。无论如何,答案的重要部分是“这是一个错误,这个”,所以我将删除其余部分。 (2认同)