繁体   English   中英

折叠表达式和参数包:静态断言中的 Args&& 和 Args 之间的区别

[英]Fold expressions and parameter pack: difference betwen Args&& and Args inside static_assert

这段代码来自
https://en.cppreference.com/w/cpp/language/fold

template<typename T, typename... Args>
void push_back_vec(std::vector<T>& v, Args&&... args){
    static_assert((std::is_constructible_v<T, Args&&> && ...));
    (v.push_back(std::forward<Args>(args)), ...);
}

我不明白为什么 static 断言检查Args&&而不是Args

这适用于像这样的极端情况,当您只有类型声明但没有定义时( std::is_constructible 对不完整类型- 在这种情况下is_constructible是 UB ):

struct B;

struct A {
    A(const A&) = default;
    A(const B&) {}

    A(A&&) = default;
    A() = default;
};
B&& getB();

template<typename T, typename... Args>
void push_back_vec(std::vector<T>& v, Args&&... args){
    static_assert((std::is_constructible_v<T, Args&&> && ...));
    (v.push_back(std::forward<Args>(args)), ...);
}

template<typename T, typename... Args>
void push_back_vec2(std::vector<T>& v, Args&&... args){
    static_assert((std::is_constructible_v<T, Args> && ...));
    (v.push_back(std::forward<Args>(args)), ...);
}

int main(int argc, char* argv[])
{
    std::vector<A> a;

    push_back_vec(a, A(), A());
    push_back_vec2(a, A(), A());

    A aa;
    push_back_vec(a, aa, aa, A());
    push_back_vec2(a, aa, aa, A());


    push_back_vec(a, getB());
    // code below won't compile
    //push_back_vec2(a, aa, A(), getB());
}

活生生的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM