私はそれが整形式であると思います、私はまっすぐな声明を見つけませんでした(言葉遣いは時々特定の状況のための明確さ/イラストに欠けます)、しかし私はそれが推測されるかもしれないと思います:
§5.1.2/23:
キャプチャとそれに続く省略記号は、パック拡張(14.5.3)です。[ 例:
template<class... Args>
void f(Args... args) {
auto lm = [&, args...] { return g(args...); };
lm();
}
—終了例]
- キャプチャの後に省略記号が続く
args
場合は、ラムダキャプチャでのキャプチャの例(この場合は明示的)であり、注目すべき事実はargs
パラメータパック識別子です。この短い段落は、ラムダキャプチャがパック拡張を保持する方法を説明する唯一の役割を果たします。これは、パラメータパックをキャプチャできるようにすることを目的としていない場合でも、パラメータパックをキャプチャできることを示しています。
§5.1.2/12:
エンティティが明示的または暗黙的にキャプチャされた場合、エンティティはキャプチャされます。[...]
§3/3:
エンティティは、値、オブジェクト、参照、関数、列挙子、型、クラスメンバー、テンプレート、テンプレートの特殊化、名前空間、パラメーターパック、またはこれです。
このことから、パラメータパックは明示的または暗黙的にキャプチャできるエンティティであると想定します。したがって、パラメータパックがそれに応じて拡張されることを除いて、通常の変数と同じキャプチャルールが適用されます。
あなたの質問(および同じ議論)は、たとえば参照変数にも同様に適用できると思います(参照にストレージが必要かどうかは指定されていません。§8.3.2/ 4)。ラムダ内のパラメーターパック識別子を参照することが許可されているかどうかに関心があるようです。
外部スコープの参照変数についても同じように考えることができます。これは、それらにアクセスできる可能性があるが、元の変数の識別子にアクセスすることさえ許可されていないためです。
それらはパラメータパックと同じくらいエーテル的です。