我在板上发现了一个参数包扩展,但我不明白到底发生了什么

I've found a parameter pack expansion here on the board and I don't understand what exactly is going

本文关键字:发生了 什么 扩展 明白 参数 发现 一个 包扩展      更新时间:2023-10-16

我在黑板上看到了一个我不明白的代码片段:

struct expression_sequence
{
    template<typename... Ts>
    expression_sequence(Ts&&... ts) { }
};
template<typename T, class Tuple = std::vector<T>>
class vector
{
public:    
    template<typename... Elements>
    vector(Elements&&... elements)
    {
        m_elements.reserve(sizeof...(Elements));
        expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };
    }
private:
    Tuple m_elements;
};

expression_sequence{ (m_elements.push_back(std::forward<Elements>(elements)), 0)... };到底发生了什么,为什么它有效?

我不明白为什么我们需要用(, 0)包围m_elements.push_back(std::forward<Elements>(elements)).(为什么0,即为什么int(m_elements.push_back(std::forward<Elements>(elements)), 0)的类型是什么?

这是一种解决方法,等待折叠表达式。

目前,push_back只接受一个元素,因此您无法解压缩参数列表。
使用这个技巧,使用类及其(让我说)可变参数构造函数,您可以成功地解压缩参数包,但该类仍然需要一个类型列表,即使它不使用这些参数。
因此,使用周围的部分(, 0)实际上允许支持结构从int列表中自动推断其类型,以便编译该代码。

有人可能会争辩说支撑结构是完全无用的。
当然,这只不过是一个技巧,因为折叠表达式计划在修订版 C++17 中。