C++と色々

主にC++やプログラムに関する記事を投稿します。

初期化キャプチャでは可変長引数テンプレートはキャプチャできない

初期化キャプチャ(init-capture)で、可変長引数テンプレート(variadic templates)をキャプチャしようと思って調べてのですが、できないようです。キャプチャデフォルト(capture-default)と単純キャプチャ(simple-capture)でキャプチャすることは出来ます。

#include <iostream>
#include <utility>

void print() {}

template <typename T, typename ...Args>
void print(T&& t, Args&&... args) {
    std::cout << t << std::endl;
    print(std::forward<Args>(args)...);
}

template <typename ...Args>
auto f(Args&&... args) {
    return [&](){ print(std::forward<Args>(args)...); }; // ok. capture-defaultでキャプチャできる
    //return [&args...](){ print(std::forward<Args>(args)...); }; // ok. simple-captureでキャプチャできる
    //return [&args = args](){ print(std::forward<Args>(args)...); }; // NG
    //return [&args... = args](){ print(std::forward<Args>(args)...); }; // NG
    //return [&args = args...](){ print(std::forward<Args>(args)...); }; // NG
    //return [&args... = args...](){ print(std::forward<Args>(args)...); }; // NG
    //return [&args = std::forward<Args>(args)...](){ print(std::forward<Args>(args)...); }; // NG
}

int main() {
    auto disp = f(1, 3.14, "hello");
    disp();
}

実行結果

1
3.14
hello

参考