一个直截了当的答案是,这不是标准允许包扩展的上下文。允许上下文的完整列表在 14.5.3/4 中指定:
4 包扩展由一个模式和一个省略号组成,其实例化会在列表中产生零个或多个模式的实例化(如下所述)。模式的形式取决于扩展发生的上下文。包扩展可能发生在以下情况下:
— 在函数参数包中(8.3.5);模式是没有省略号的参数声明。
— 在作为包扩展 (14.1) 的模板参数包中:
— 在初始化列表中(8.5);该模式是一个初始化子句。
— 在基本说明符列表中(第 10 条);模式是一个基本说明符。
— 在 mem-initializer-list (12.6.2) 中;该模式是一个内存初始化器。
— 在模板参数列表 (14.3) 中;该模式是一个模板参数。
— 在动态异常规范(15.4)中;模式是类型标识。
— 在属性列表中(7.6.1);模式是一个属性。
— 在对齐说明符(7.6.2)中;模式是没有省略号的对齐说明符。
— 在捕获列表中(5.1.2);该模式是一个捕获。
— 在 sizeof... 表达式 (5.3.3) 中;模式是一个标识符。
这是一种可能的解决方法,可确保以从左到右的顺序评估参数:
struct expand_aux {
template<typename... Args> expand_aux(Args&&...) { }
};
template<typename... Args>
inline void expand(Args&&... args)
{
expand_aux temp { some_function(std::forward<Args>(args))... };
}