Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++_Variadic Templates_Aggregate Initialization - Fatal编程技术网

C++ 可变函数调用中的强制括号省略

C++ 可变函数调用中的强制括号省略,c++,variadic-templates,aggregate-initialization,C++,Variadic Templates,Aggregate Initialization,我有两个豆荚 struct A { float x; float y; }; struct B { A a; int i; } 还有一个变量函数,它使用(我认为是)一个集合来分配豆荚 template<typename T, class... Args> void remake(T* location, Args&&... args) { *T = { std::forward<Args>(args)... }; } 但

我有两个豆荚

struct A
{
   float x;
   float y;
};

struct B
{
   A a;
   int i;
}
还有一个变量函数,它使用(我认为是)一个集合来分配豆荚

template<typename T, class... Args>
void remake(T* location, Args&&... args)
{
   *T = { std::forward<Args>(args)... };
}
但在不使用大括号省略的情况下用于B时出错:
模板函数“remake”的实例与参数列表不匹配。参数类型为:(B*,{…},int)

当与B一起使用(我认为是)括号省略时有效

remake(b_ptr, 7.0f, 6.0f, 9)
我觉得我调用remake的第一种形式(B*,…)在意图上更加明确,它明确地显示了嵌套结构正在获取其数据的位置,但在其当前形式中不可用。我真的觉得这个错误可能是可变模板和初始值设定项列表之间微妙的交互作用的结果(并且缺乏对它们的理解)。或者是我完全错过的完全不同的东西

我试图在第一部翻拍(B*,…)中完成的是可能的吗? 如果是这样,我做错了什么,使它无法按预期工作


添加:目的


我想要这个模式的应用程序是一个内存重用的同质数据结构,它为这些pod保存预先分配的数组。外部对象可以请求创建一个POD,并提供结构值,此时数据结构会找到一个未使用的数组位置并用这些值填充它。所以重做看起来像
T*create(Args&&…Args)
(容器是指针稳定的)

{7.0f,6.0f}
没有类型,所以不能用
T&&
推导。您可以使用
remake(b_ptr,A{7.0f,6.0f},9)
在某种意义上说,在将带括号的值列表绑定到转发引用时,不可能“一脚踢开”,这一定是有原因的。@Jarod42我可能完全错了,但您的调用
remake(b_ptr,A{7.0f,6.0f},9)
初始化一个结构a,当分配给
*b_ptr
时,该结构a将在重做函数中被复制(尽管很简单)?我不认为拥有额外的拷贝会极大地改变性能或内存特性,但这似乎违背了我认为完美转发的目的accomplish@loaner9翻拍()有什么意义?直接分配有什么好处?这就是说,如果您想避免构造中间子结构,您可以滚动自己的元组引用并使用它,例如remake(ptr,sub{1,2},3)。。。(你也可以使用std::tuple,但你将被迫不使用它们作为子结构)@loaner9完美转发中的“完美性”仅指保留r/左值的能力;它没有保留整个表达式分类法,更不用说非表达式(例如brace init列表)。
{7.0f,6.0f}
没有类型,因此不能用
t&
进行推断。您可以使用
remake(b_ptr,A{7.0f,6.0f},9)
在某种意义上说,在将带括号的值列表绑定到转发引用时,不可能“一脚踢开”,这一定是有原因的。@Jarod42我可能完全错了,但您的调用
remake(b_ptr,A{7.0f,6.0f},9)
初始化一个结构a,当分配给
*b_ptr
时,该结构a将在重做函数中被复制(尽管很简单)?我不认为拥有额外的拷贝会极大地改变性能或内存特性,但这似乎违背了我认为完美转发的目的accomplish@loaner9翻拍()有什么意义?直接分配有什么好处?这就是说,如果您想避免构造中间子结构,您可以滚动自己的元组引用并使用它,例如remake(ptr,sub{1,2},3)。。。(你也可以使用std::tuple,但你将被迫不使用它们作为子结构)@loaner9完美转发中的“完美性”仅指保留r/左值的能力;它并没有保留整个表达式分类法,更不用说非表达式(例如大括号初始化列表)。
remake(b_ptr, {7.0f, 6.0f}, 9)
remake(b_ptr, 7.0f, 6.0f, 9)