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

std::any转引用类型修改值后原对象未改变的问题咨询

问题分析与解答

你的期望是合理的:通过std::any_cast获取std::any内部对象的引用后,修改引用确实应该同步改变原对象的值。问题出在代码的最后一行,而非引用转换的逻辑。

核心问题拆解

  1. 引用转换是正确的:
    My& b2 = any_cast<My&>(a);这一步确实拿到了a内部存储的My对象的引用,修改b2.m_i = 6后,a内部的对象m_i已经被改成了6。

  2. 输出语句触发了意外拷贝:
    最后一行的any_cast<My>(a)会执行拷贝构造,创建一个全新的My对象。而你的My类拷贝构造函数硬编码将m_i初始化为2,所以你输出的是这个拷贝对象的m_i,而非a内部原对象的值。

验证原对象已被修改的正确方式

将输出语句改为直接通过引用访问内部对象,避免拷贝:

cout << any_cast<My&>(a).m_i << endl;

此时会输出6,符合你最初的预期。

额外说明

你的My类的拷贝/移动构造函数行为比较特殊(硬编码初始化值),这容易掩盖问题本质。如果把拷贝构造函数改为复制原对象的m_i:

My(const My& other) : m_i(other.m_i) {}

即使你用any_cast<My>(a)输出,也会得到6,因为拷贝的是修改后的原对象值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:40:38