C++11 では、ラムダ関数はオブジェクトであり、それで make_tuple を呼び出すことができるはずですよね?
void foobar() {
auto t = std::make_tuple([](){ std::make_shared<int>(); });
}
このコードは私にとってはうまくいきます。
可変個引数テンプレートを追加するとどうなるか:
#include <tuple>
#include <memory>
template <class... T>
void foobar() {
auto t = std::make_tuple([](){ std::make_shared<T>(); }...);
}
int main(int, char**)
{
foobar<int, float, double>();
return 0;
}
これは GCC 4.7.2 でコンパイルに失敗します
main.cpp: In lambda function:
main.cpp:6:54: error: parameter packs not expanded with '...':
main.cpp:6:54: note: 'T'
main.cpp: In function 'void foobar()':
main.cpp:6:57: error: expansion pattern '#'lambda_expr' not supported by dump_expr#<expression error>' contains no argument packs
main.cpp: In instantiation of 'void foobar() [with T = {int, float, double}]':
main.cpp:11:29: required from here
このコードは標準で正しいのでしょうか?