率直な答えは、これは標準がパックの拡張を許可するコンテキストではないということです。許可されたコンテキストの完全なリストは、14.5.3/4 で指定されています。
4 パック展開は、パターンと省略記号で構成され、そのインスタンス化により、リスト内のパターンの 0 個以上のインスタンス化が生成されます (後述)。パターンの形式は、展開が発生するコンテキストによって異なります。パック拡張は、次のコンテキストで発生する可能性があります。
— 関数パラメータパック (8.3.5); パターンは、省略記号のないパラメーター宣言です。
— パック拡張 (14.1) であるテンプレート パラメーター パック:
— 初期化子リスト (8.5) 内。パターンは初期化句です。
— base-specifier-list (第 10 節); パターンは base-specifier です。
— mem-initializer-list (12.6.2); パターンは mem-initializer です。
— テンプレート引数リスト (14.3)。パターンはテンプレート引数です。
— 動的例外仕様 (15.4)。パターンはタイプ ID です。
— 属性リスト (7.6.1)。パターンは属性です。
— アラインメント指定子 (7.6.2) 内。パターンは、省略記号を除いた配置指定子です。
— キャプチャリスト (5.1.2)。パターンはキャプチャです。
— sizeof... 式 (5.3.3) 内。パターンは識別子です。
引数が左から右の順序で評価されることを保証する 1 つの可能な回避策を次に示します。
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))... };
}