尝试
template<typename... T>
auto foo(T&&... t){
[](T&&... u){ }(std::forward<T>(t)...); // (1)
return std::thread( // (2)
[](auto &&... u){ },
std::forward<T>(t)...
);
}
我的意思是:在你传递给的 lambda 中std::thread()
,auto && ...
而不是T && ...
. 或者,也许,T const & ...
。
我不是语言层,也许有人可以纠正我,但在我看来,通用引用和 r 值引用之间存在冲突。以及将以下参数的副本std::thread()
传递给第一个参数的事实。
当你写
template<typename... T>
auto foo(T&&... t)
是&&
通用引用并T...
成为int
, 当你打电话foo(1)
, 和int &
, 当你打电话foo(n)
。
在你得到的函数里面
[](int){ }(std::forward<int>(t)); // (1)
return std::thread( // (2)
[](int){ },
std::forward<int>(t)...
);
万一f(0)
。
这是有效的,因为两个 lambda 都在等待一个int
副本,而这永远有效。
但是当你打电话时f(n)
,foo()
你会得到
[](int &){ }(std::forward<int>(t)); // (1)
return std::thread( // (2)
[](int &){ },
std::forward<int>(t)...
);
这适用于第一次调用,因为 lambda 等待一个int
左引用变量 ( int &
) 并获取一个int
左引用变量,但不适用于第二次调用,因为将(so a right-reference, )的副本std::thread
传递给等待左引用的 lambda。std::forward<int>(t)
int &&