Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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/1/hibernate/5.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_C++11_Variadic Templates - Fatal编程技术网

C++ 将可变模板参数解包到数组中,并为每种类型应用函数

C++ 将可变模板参数解包到数组中,并为每种类型应用函数,c++,arrays,c++11,variadic-templates,C++,Arrays,C++11,Variadic Templates,我对以下代码有问题 template<typename... TArgs> void SomeFunc() { Foo* data[] = { Func<TArgs>()..., // <- expand the pack into array but calling Func for each type nullptr }; } 就像nullptr元素从未出现过一样。如果我将数组的声明更改为: Foo* data[sizeof..

我对以下代码有问题

template<typename... TArgs>
void SomeFunc() {
   Foo* data[] = {
     Func<TArgs>()..., // <- expand the pack into array but calling Func for each type
     nullptr
   };
}
就像nullptr元素从未出现过一样。如果我将数组的声明更改为:

Foo* data[sizeof...(TArgs) + 1] = 
错误消息也会更改:

Error   2   error C4789: buffer 'data' of size 8 bytes will be overrun; -4 bytes will be written starting at offset 8

我错过了什么?如果有人能告诉我,因为我显然是在讨论这个问题太久了,可能看不到这里的主要问题。

只是又一次尝试寻找解决办法(评论时间太长了,所以我将把它作为一个答案发布):

structfoonull{};
模板Foo*FuncWrapper(){return Func();}
模板Foo*FuncWrapper(){return nullptr;}
模板
void SomeFuncImpl(){
Foo*数据[]={
FuncWrapper()。。。
};
}
模板
void SomeFunc(){
SomeFuncImpl();
}

在GCC中运行良好,我认为代码没有任何问题。可能是VC++的错误?用
(Foo*)0
替换
nullptr
时会发生什么情况?同样,无法分配大小为0的数组。。。啊,如果这是编译器中的一个bug,我有一种强烈的冲动要打VC++团队的人的脸。。。在下一次尝试修复它时浪费了这么多时间:添加
Foo*NullFoo(){return nullptr;}
并将代码中的
nullptr
替换为
NullFoo()
。我认为这是一个bug,但打任何人的脸可能都是没有道理的——它已经被修复了(2013 RTM编译得很好)好吧,我没有“特权”与VC2013一起工作,“丹尼尔弗雷,不幸的是,它没有效果,我回来告诉你,实际上你的代码编译,所以我认为这是一个答案,但你有点太迟了,无论如何,我发现另一个解决问题的办法;谢谢你能评论一下你修改过的解决方案吗?从MSVC 2013更新5开始,我仍然遇到这个bug…:(@WenzelJakob FWIW,看起来与我的一个项目中的类似。似乎1)警告只在调试模式下出现,2)它是假的(除非编译器会做一些非常愚蠢的事情,但没有人报告任何实际问题),最后3)问题可能会用最新版本的VS2015修复。
Error   2   error C4789: buffer 'data' of size 8 bytes will be overrun; -4 bytes will be written starting at offset 8
struct FooNull {};

template<typename T> Foo* FuncWrapper() { return Func<T>(); }
template<> Foo* FuncWrapper< FooNull >() { return nullptr; }

template<typename... TArgs>
void SomeFuncImpl() {
    Foo* data[] = {
        FuncWrapper<TArgs>()...
    };
}

template<typename... TArgs>
void SomeFunc() {
    SomeFuncImpl<TArgs...,FooNull>();
}