【发布时间】:2015-05-07 09:28:28
【问题描述】:
这是有问题的成语:
template<typename... T>
void f(T... t) {
int temp[] = {(g(t), 0)...};
}
这将被编译为g(t0); g(t1); ...,函数调用的顺序由 C++11[dcl.init.list]/4 保证。
更好的版本使用std::initializer_list而不是数组,但在这里并不重要。
问题是:我们应该如何称呼这个成语?
更新:
基本上,这是我们应该建议人们使用它而不是递归的习语,即替换两个重载void f() {}void f(H head, T... tail) { g(head); f(tail...); }
带单void f(T... t) { int temp[]{(g(t), 0)...}; }
当然我们可以称它为“将被Fold Expressions取代的成语”,但我希望有一个合适的术语。
【问题讨论】:
-
顺便说一句,在 C++1z 中,这可能会被Fold Expressions取代
-
“包扩展”似乎涵盖了它,是吗?
-
@Cheersandhth.-Alf,谢谢,已修复。不,这不仅仅是“包扩展”——数组的使用在这里起着关键作用。这有点像“this idion vs recursion”
-
是的,检查过,C++11 标准在 §5.1.2/23 中准确地将此代码称为包扩展。
-
我可能是盲人,但我在 C++11 §14.5.3/4 中找不到允许在函数调用中进行包扩展的地方(显然是有效的)?
标签: c++ c++11 variadic-templates idioms