c++ - 折叠表达式和参数包 : difference betwen Args&& and Args inside static_assert

标签 c++ c++17 fold-expression

这段代码来自
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)), ...);
}

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

最佳答案

当您只有类型声明而没有定义时(std::is_constructible on incomplete types - 在这种情况下 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());
}

Live example

关于c++ - 折叠表达式和参数包 : difference betwen Args&& and Args inside static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58403414/

相关文章:

c++ - 在 C++ 中解包嵌套元组

c++ - 制作 lambda constexpr 的要求是什么?

c++ - MSVC 中的折叠表达式

c++ - 与给定类型相似的最广泛可能类型 - C++

c++ - c++中调试和文件流的奇怪错误

java - CallObjectMethod 不返回字符串

python - 在 python 中线程化 c++ 程序

c++ - static/dynamic/const/reinterpret_cast 可以在未评估的上下文中使用吗?

c++ - 如何获取指向重载未知的重载函数的任何重载的指针?

com - 通过使用具有有限可变参数的模板函数来限制允许的 COM 接口(interface) (std::is_same)