Hasty Briefsbeta

双语

Interconverting std::function with copyable_function

3 days ago
  • C++11的std::function存在设计缺陷:臃肿的API、可变调用对象下const operator()的约束,以及异常处理导致无法声明noexcept。
  • C++26引入了std::copyable_function以修复这些问题,但仍保留了隐式转换和nullptr赋值等次优设计。
  • copyable_function与function可相互转换,但简单实现可能形成调用对象的“链表”,导致性能随时间下降。
  • libstdc++当前因包装器嵌套呈现O(n)调用开销,而Microsoft STL避免了此问题,libc++尚未实现。
  • 在既有代码中混用copyable_function和function会导致逻辑内存泄漏和执行变慢,特别是频繁转换时。
  • 建议:在同一代码库中避免混用这两种类型;新代码应编写自定义类型擦除调用对象,或始终使用同一类型。