为什么将参数包传递给具有一个模板参数的函数会多次调用它?

Why does passing a parameter pack to a function with one template parameter call it multiple times?

取此代码:

template<typename T>
int foo()
{
    std::cout << "foo called" << std::endl;
    return 10;
};

template<typename... Ts>
std::vector<int> bar(Ts... ts)
{
    std::vector<int> vec{foo<Ts>()...};
    return vec;
};

int main()
{
    std::vector<int> vec = bar(1,2,3,4);
}

上面的代码输出:

foo called
foo called
foo called
foo called

这怎么可能?我以为我已经理解了模板参数包,但是 std::vector<int> vec{foo<Ts>()...}; 行如何导致 foo 被多次调用? foo 是否返回参数包,因为我们在函数调用中使用了 ... 运算符?

这段代码是怎么回事?

foo<T>()... 扩展为 foo<T1>(), foo<T2>(), foo<T2>(), ...。在你的例子中,由于你的向量有四个分量,你的函数将被调用四次。