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

C++17 any_cast无法触发隐式构造抛出bad_any_cast异常咨询

问题结论

你对std::any_cast的转换规则确实存在理解偏差。
std::any是类型安全的类型擦除容器,any_cast不会执行任何隐式类型转换,也不会自动调用目标类型的构造函数完成跨类型构造:它只会校验std::any实例内部存储的实际类型,和你传入的目标模板类型是否严格匹配(仅允许忽略顶层const、引用属性的合法匹配),匹配成功才会返回对应的值/引用,类型不匹配就会直接抛出std::bad_any_cast异常。

你的测试代码中,any a = 1;初始化后,a内部存储的实际类型是int,从来没有存储过My类型的对象。执行any_cast<My>(a)时,检测到内部存储类型int和目标类型My不匹配,直接抛出异常,整个过程根本不会尝试调用My(int)构造函数,和你是否为My定义了int入参的构造函数没有关系。

正确使用方式
  • 要从存储int的std::any实例得到My对象,必须先通过any_cast<int>取出内部存储的int值,再用这个值显式构造My对象,你代码中写的auto am = My(any_cast<int>(a));就是符合要求的正确写法,这行代码也确实正常触发了My的int构造函数,对应输出的第一行int ctor。
  • 如果需要频繁做这类跨类型转换,可以自行封装辅助转换函数,不要依赖any_cast做自动隐式构造。

你代码中前一行cout << a.type().name() << ": " << any_cast<int>(a) << '\n';能正常输出i: 1,就是因为目标类型int和a内部存储的类型完全匹配,符合any_cast的转换规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:21:33