C++23是否有支持const/ref/noexcept的可复制函数包装器?若无是否有替代库?
支持复制的增强型函数包装器方案
C++23的std::move_only_function特性
C++23引入了std::move_only_function,它支持隐式this参数的const、左/右值引用限定,以及函数本身的noexcept(true/false)特性匹配。而旧版的std::function缺少这些精细的重载支持:
#include <functional> int main(){ std::function<void()>([]noexcept(true){}); // okay ✓ std::function<void()>([]noexcept(false){}); // okay ✓ std::function<void()noexcept>([]noexcept(true){}); // not supported std::function<void()noexcept>([]noexcept(false){}); // not supported std::move_only_function<void()>([]noexcept(true){}); // okay ✓ std::move_only_function<void()>([]noexcept(false){}); // okay ✓ std::move_only_function<void()noexcept>([]noexcept(true){}); // okay ✓ std::move_only_function<void()noexcept>([]noexcept(false){}); // fails ✓ std::function<void()>([i=0]{}); // okay ✓ std::function<void()>([i=0]mutable{}); // okay ✓ std::function<void()const>([i=0]{}); // not supported std::function<void()const>([i=0]mutable{}); // not supported std::move_only_function<void()>([i=0]{}); // okay ✓ std::move_only_function<void()>([i=0]mutable{}); // okay ✓ std::move_only_function<void()const>([i=0]{}); // okay ✓ std::move_only_function<void()const>([i=0]mutable{}); // fails ✓ }
std::move_only_function的局限性:不可复制
正如其名,std::move_only_function不支持复制语义,无法直接存入需要复制操作的容器(如std::vector):
#include <functional> #include <vector> int main(){ auto const fn = []{}; std::function<void()> a = fn; std::vector<std::function<void()>> a_list{a, a}; std::move_only_function<void()> b = fn; std::vector<std::move_only_function<void()>> b_list{b, b}; // error }
支持复制的替代方案
C++23标准库中没有直接提供同时具备std::move_only_function的增强调用特性(const/noexcept/引用限定)且支持复制的函数包装器。可以通过以下第三方库实现需求:
- Boost.Function2:Boost库的扩展组件,完整支持
const、noexcept以及引用限定符的重载匹配,同时保持可复制性,兼容C++11及以上标准,拥有被包装函数的所有权。 - Abseil AnyInvocable:Abseil库的
AnyInvocable支持所有调用特性(包括const、noexcept),支持复制操作,且持有被包装对象的所有权。 - folly::Function:Facebook Folly库中的
Function实现了类似的增强功能,支持noexcept和引用限定符,同时具备复制语义。
这些库的核心优势是在保留std::move_only_function的精细调用匹配能力基础上,实现了复制语义,满足"拥有函数所有权且可复制"的需求。
内容的提问来源于stack exchange,提问作者Benjamin Buch
相关产品推荐
相关产品推荐

