You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用std::dynamic_pointer_cast报‘引用已删除函数’错误的排查

问题分析与解决:dynamic_pointer_cast触发"attempting to reference a deleted function"错误

错误诱因

这个错误的核心原因在于**std::shared_ptr<T[]>是C++17才正式纳入标准的特性**:

  • 如果你使用的是C17之前的编译器标准(比如C11或C++14),std::shared_ptr<int[]>的数组特化根本不存在,编译器会将该写法视为非法定义,相关构造、赋值函数会被隐式标记为删除状态。
  • 你的DerivedShared类因包含std::shared_ptr<int[]>成员,编译器自动生成的拷贝构造、移动构造等特殊成员函数也会被连带隐式删除。
  • std::dynamic_pointer_cast的内部实现需要用到目标类型的这些特殊成员函数(比如创建临时对象时的拷贝操作),因此触发了"attempting to reference a deleted function"错误。
  • 而static_pointer_cast仅做编译时类型转换,无需运行时类型检查和复杂的临时对象操作,因此能绕过该问题正常编译。

解决方法

有几种可行的解决路径:

  • 升级编译器标准:将编译选项设置为C++17或更高版本(例如-std=c++17),此时std::shared_ptr<int[]>的数组特化会被正确识别,相关成员函数正常可用,错误会直接消失。
  • 替换数组指针类型:若无法升级编译器,换用兼容性更好的类型:
    • 用std::unique_ptr<int[]>替代std::shared_ptr<int[]>,它在C++11中就支持数组特化;
    • 直接使用std::vector<int>,完全避免手动管理数组内存,代码更简洁安全。
  • 自定义删除器兼容旧标准:如果必须使用std::shared_ptr,可以给普通std::shared_ptr<int>添加自定义删除器,模拟数组特化的行为:
    // 替换DerivedShared构造函数中的赋值语句
    data = std::shared_ptr<int>(new int[3]{1,2,3}, [](int* p) { delete[] p; });
    

关于标准库的说明

这并非标准库的Bug,而是不同C++版本的特性差异:C++17之前的标准未对shared_ptr的数组特化做出规定,编译器自然无法支持该用法。dynamic_pointer_cast的行为完全符合标准,只是在旧标准下因目标类型的特殊成员函数被删除而触发错误。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:52:49