模板中的 C++ 20 lambda:无法从 lambda 中推断出“auto*”

C++ 20 lambda in template: unable to deduce ‘auto*’ from lambda

给定以下简单包装器结构(受 启发):

template <auto* F> struct Wrapper;

template <class Ret, class... Args, auto (*F)(Args...) -> Ret>
struct Wrapper<F>
{
    auto operator()(Args... args) const
    {
        return F(args...);
    }
};

以下作品:

int this_works(){
    return 42;
}
int main(){
    return Wrapper<this_works>()();
}

但我想要这个,使用 c++ 20:

int main(){
    return Wrapper<[](){return 42;}>()();
}

g++-11 --std=c++20clang++13 --std=c++20 都抱怨后者 带有一些难以破译的错误信息,包括:

有没有办法使第二个示例起作用?我尝试了一个 constexpr 函数 指向 lambda 的指针,但它抱怨它没有链接 ...

Wrapper 需要函数指针,但模板参数推导不会考虑隐式转换(从没有捕获的 lambda 到函数指针)。

您可以将 lambda 显式转换为函数指针:

int main(){
    return Wrapper<static_cast<int(*)()>([](){return 42;})>()();
}

int main(){
    return Wrapper<+[](){return 42;}>()();
}

LIVE