模板中的 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++20
和 clang++13 --std=c++20
都抱怨后者
带有一些难以破译的错误信息,包括:
- 不匹配的类型‘auto*’和‘main()::
- 错误:类型为 'auto *' 的非类型模板参数 'F' 具有不兼容的初始值设定项
有没有办法使第二个示例起作用?我尝试了一个 constexpr 函数
指向 lambda 的指针,但它抱怨它没有链接 ...
Wrapper
需要函数指针,但模板参数推导不会考虑隐式转换(从没有捕获的 lambda 到函数指针)。
您可以将 lambda 显式转换为函数指针:
int main(){
return Wrapper<static_cast<int(*)()>([](){return 42;})>()();
}
或
int main(){
return Wrapper<+[](){return 42;}>()();
}
给定以下简单包装器结构(受
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++20
和 clang++13 --std=c++20
都抱怨后者
带有一些难以破译的错误信息,包括:
- 不匹配的类型‘auto*’和‘main()::
- 错误:类型为 'auto *' 的非类型模板参数 'F' 具有不兼容的初始值设定项
有没有办法使第二个示例起作用?我尝试了一个 constexpr 函数 指向 lambda 的指针,但它抱怨它没有链接 ...
Wrapper
需要函数指针,但模板参数推导不会考虑隐式转换(从没有捕获的 lambda 到函数指针)。
您可以将 lambda 显式转换为函数指针:
int main(){
return Wrapper<static_cast<int(*)()>([](){return 42;})>()();
}
或
int main(){
return Wrapper<+[](){return 42;}>()();
}