Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变lambda与可变模板函数:严格等效?_C++ - Fatal编程技术网

C++ 可变lambda与可变模板函数:严格等效?

C++ 可变lambda与可变模板函数:严格等效?,c++,C++,考虑一下这个代码片段 #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

考虑一下这个代码片段

#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 << "Elapsed time: " << elapsed.count() << "s";
    return result;
 }
#包括
自动包装CallLambda=
[](自动fn、自动和…参数)
{
const auto start=std::chrono::system_clock::now();
自动结果=fn(标准::正向(参数)…);
const auto end=std::chrono::system_clock::now();
常量自动运行=结束-开始;

std::cout
wrapAndCallLambda
是一个实际对象,而
wrapAndCall
是一个模板

这意味着您可以将
wrapAndCallLambda
直接传递给其他函数,并且您必须显式地传递
&wrapAndCall
,或者将其包装到另一个lambda中,该lambda转发其参数

这也意味着您不能重载或专门化
wrapAndCallLambda
,但您可以轻松地为
wrapAndCall
编写另一个重载

您也无法通过ADL找到
wrapAndCallLambda
。这可能是您想要的功能。

w.r.t.“显式传递”-在这种情况下,您实际上并没有传递lambda对象,而是传递一个指向(实例化)方法转换为的函数的指针,对吗?如果是,这是否意味着它只适用于无CaptureLambda?