std::any转引用类型修改值后原对象未改变的问题咨询
问题分析与解答
你的期望是合理的:通过std::any_cast获取std::any内部对象的引用后,修改引用确实应该同步改变原对象的值。问题出在代码的最后一行,而非引用转换的逻辑。
核心问题拆解
引用转换是正确的:
My& b2 = any_cast<My&>(a);这一步确实拿到了a内部存储的My对象的引用,修改b2.m_i = 6后,a内部的对象m_i已经被改成了6。输出语句触发了意外拷贝:
最后一行的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
相关产品推荐
相关产品推荐

