在Stack Overflow问题中,在C++ 11中不允许重新定义lambda,为什么?,给出了一个不编译的小程序:
int main() {
auto test = []{};
test = []{};
}
Run Code Online (Sandbox Code Playgroud)
问题得到了回答,一切似乎都很好.然后是Johannes Schaub并做了一个有趣的观察:
如果你
+
在第一个lambda之前放置一个,它会神奇地开始工作.
所以我很好奇:为什么以下工作呢?
int main() {
auto test = +[]{}; // Note the unary operator + before the lambda
test = []{};
}
Run Code Online (Sandbox Code Playgroud)
考虑这个代码片段
#include <chrono>
auto wrapAndCallLambda =
[] (auto fn, auto &&... params)
{
const auto start = std::chrono::system_clock::now();
auto result = fn(std::forward<decltype(params)>(params)...);
const auto end = std::chrono::system_clock::now();
const auto elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << "s";
return result;
};
template <typename Fn, typename... Args>
auto wrapAndCall(Fn fn, Args &&... params)
{
const auto start = std::chrono::system_clock::now();
auto result = fn(std::forward<decltype(params)>(params)...);
const auto end = std::chrono::system_clock::now();
const auto elapsed = end - start;
std::cout …
Run Code Online (Sandbox Code Playgroud)