如何正确调用携带无参数模板参数的C++ Lambda表达式?
你写的调用方式报错的核心原因是:泛型lambda的模板参数是属于它的operator()成员函数的,而非闭包对象foo本身的,所以不能直接给foo加模板实参列表。
正确的调用方式有两种:
方式1:显式调用operator()
直接指定operator()的模板实参即可:
foo.operator()<false>();
这是C20标准规定的通用写法,所有支持C20泛型lambda模板参数的编译器(包括MSVC 2019)都能正常识别。
方式2:包装为模板函数简化调用
如果你觉得显式写operator()太繁琐,可以额外封装一层模板函数:
auto foo = []<bool B>() { return B; }; template<bool B> inline constexpr decltype(auto) foo_call() { return foo.operator()<B>(); } // 调用时就可以用你习惯的写法 foo_call<false>();
如果你使用C++23及以上标准,也可以用单参数lambda+std::integral_constant实现类似效果,调用时写法更直观:
#include <type_traits> auto foo = []<bool B>(std::integral_constant<bool, B>) { return B; }; // 调用时直接传常量标签即可 foo(std::false_type{});
内容的提问来源于stack exchange,提问作者Dess
相关产品推荐
相关产品推荐

