C++ 可变模板数组调用未定义的行为
我试图提供一个参数包来初始化数组。我认为它应该起作用,因为: 我用的是sizeof。。。获取参数包的大小 它是一个模板,sizeof是一个编译时构造,所以它应该在编译时就知道,这意味着arr不应该是一个可变长度数组 我正确地转发了这些论点 然而,我得到了垃圾作为输出和警告。首先是守则: 包括 包括 样板 无效fooArgs&&。。。args { int-arr[sizeof…Args]{std::forwardargs…}; 对于自动i=0u;iC++ 可变模板数组调用未定义的行为,c++,arrays,templates,c++11,undefined-behavior,C++,Arrays,Templates,C++11,Undefined Behavior,我试图提供一个参数包来初始化数组。我认为它应该起作用,因为: 我用的是sizeof。。。获取参数包的大小 它是一个模板,sizeof是一个编译时构造,所以它应该在编译时就知道,这意味着arr不应该是一个可变长度数组 我正确地转发了这些论点 然而,我得到了垃圾作为输出和警告。首先是守则: 包括 包括 样板 无效fooArgs&&。。。args { int-arr[sizeof…Args]{std::forwardargs…}; 对于自动i=0u;i
for (auto i = 0u; i < sizeof...(Args); ++i)
或在填充数组时打印值,如下所示:
#include <iostream>
#include <utility>
template <typename... Args>
void foo(Args&&... args) {
int arr[sizeof...(Args)] = {
(std::cout << args(), std::forward<Args>(args)())...
};
(void)arr;
}
int a() { return 1; }
int b() { return 2; }
int c() { return 3; }
int main() {
foo(a, b, c);
}
如果该函数的唯一目的是打印值,您也可以使用:
int arr[sizeof...(Args)] = { (std::cout << args(), 0)... };
注意,上面的代码不考虑SIZEOF…ARGs等于0的情况。 这样做确实很简单,我没有回答它。
sizeofarr==sizeof…Args*sizeofint。使用Iint arr[sizeof...(Args)] = { (std::cout << args(), 0)... };