Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板数组调用未定义的行为_C++_Arrays_Templates_C++11_Undefined Behavior - Fatal编程技术网

C++ 可变模板数组调用未定义的行为

C++ 可变模板数组调用未定义的行为,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

我试图提供一个参数包来初始化数组。我认为它应该起作用,因为:

我用的是sizeof。。。获取参数包的大小 它是一个模板,sizeof是一个编译时构造,所以它应该在编译时就知道,这意味着arr不应该是一个可变长度数组 我正确地转发了这些论点 然而,我得到了垃圾作为输出和警告。首先是守则:

包括 包括 样板 无效fooArgs&&。。。args { int-arr[sizeof…Args]{std::forwardargs…}; 对于自动i=0u;istd::cout正如@Casey在注释中提到的,sizeofar返回一个变量的大小,该变量的类型为您为数组选择的类型,乘以您案例中数组本身的长度,即3*sizeofint

要解决此问题,您可以使用以下方法在sizeof…Args上迭代:

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)... };