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