折叠表达式和参数包:static_assert 内 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)), ...);
}
我不明白为什么静态断言检查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());
}
现场示例
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 折叠表达式和参数包:static_assert 内 Args&& 和 Args 之间的区别
- Ret(&)(Args...)和Ret(Args...)&有什么区别?
- 在完美转发中,'decltype(std::forward<Args>(args))...' 和 Args&& 之间有什么区别