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
相关产品推荐
相关产品推荐

