C++26 std::indirect 与 std::polymorphic 详解:值语义的多态对象

C++26 std::indirect 与 std::polymorphic 详解:值语义的多态对象 C26 std::indirect 与 std::polymorphic 详解值语义的多态对象本文是「C26 新特性单篇精讲」系列第 28 篇。阅读约需 7 分钟文末可跳转完整合订本。一、是什么C26 新增两个智能指针风格的包装器std::indirectT拥有并间接访问T值语义拷贝时深拷贝std::polymorphicT支持多态的值语义类型可持有派生类对象。二、为什么需要它C 长期缺少「值语义的多态对象」。std::unique_ptr不能拷贝std::shared_ptr共享所有权且语义复杂。polymorphic让基类容器可以直接存储派生类对象并支持正确的拷贝/移动。三、完整代码示例3.1 std::polymorphic#includememory#includeiostreamstructShape{virtualdoublearea()const0;virtual~Shape()default;};structCircle:Shape{doubler;doublearea()constoverride{return3.14159*r*r;}};structRectangle:Shape{doublew,h;doublearea()constoverride{returnw*h;}};intmain(){std::polymorphicShapesCircle{2.0};std::polymorphicShapes2s;// 多态深拷贝std::couts2-area()\n;// 12.5664s2Rectangle{3.0,4.0};std::couts2-area()\n;// 12}3.2 std::indirect#includememorystd::indirectstd::strings1{hello};autos2s1;// 深拷贝s2-append( world);四、编译器支持与特性测试宏特性GCCClangMSVCstd::polymorphic16——std::indirect16——#if__cpp_lib_polymorphic202411L#includememory#endif五、常见陷阱polymorphic要求基类有虚析构函数否则多态析构行为未定义indirect深拷贝可能开销大大对象应考虑unique_ptr或shared_ptr两者都要求目标可拷贝仅移动类型不适合。六、小结std::polymorphic和std::indirect填补了 C 值语义多态的空白。适合需要「像值一样使用的多态对象」的场景如图形对象树、插件系统、配置对象等。返回 C26 新特性全景合订本 C26 新特性全景解析C/C 后台架构学习社区欢迎关注https://github.com/0voice本文基于 C26 已批准特性撰写具体实现以编译器文档为准。