【问题标题】:std::any object cast to reference type, change its value, but original object is not changedstd::any 对象转换为引用类型,更改其值,但原始对象未更改
【发布时间】:2022-09-21 22:09:17
【问题描述】:

我试图查看 std::any 对象是否可以转换为引用类型,并查看更改转换的引用是否意味着更改原始对象。如下:

struct My {
    int m_i;
    My() : m_i(1) {}
    My(const My& _) : m_i(2) {}
    My(My&& m) : m_i(3) {};
    My& operator = (const My& _) { m_i = 4; return *this; }
    My& operator = (My&& _) { m_i = 5; return *this; }
};

int main() {
    any a = My();
    My& b2 = any_cast<My&>(a);
    b2.m_i = 6;
    cout << any_cast<My>(a).m_i << endl;
    return 0;
}

它打印2。对于我来说,我希望,只要b2 是一个参考,我希望更改b2.m_i 会影响a.m_i,对吧?但结果似乎不像我的预期。

我哪里错了,我的期望是否有效?

谢谢!

  • cout &lt;&lt; any_cast&lt;My&gt;(a).m_i &lt;&lt; endl; 创建a 的副本,并且复制构造函数执行My(const My&amp; _) : m_i(2) {},即它不复制值。将此行更改为std::cout &lt;&lt; std::any_cast&lt;My&amp;&gt;(a).m_i &lt;&lt; std::endl; 或正确实现复制构造函数。

标签: c++ casting reference c++17 any


【解决方案1】:

看看你的例子,没有任何any

#include <any>
#include <iostream>
using std::cout;
using std::endl;
using std::any;
using std::any_cast;

struct My {
    int m_i;
    My() : m_i(1) {}
    My(const My& _) : m_i(2) {}
    My(My&& m) : m_i(3) {};
    My& operator = (const My& _) { m_i = 4; return *this; }
    My& operator = (My&& _) { m_i = 5; return *this; }
};

int main() {
    My a = My();
    My& b2 = a;
    b2.m_i = 6;
    cout << static_cast<My>(a).m_i << endl;
}

Output 是:

2

因为static_cast&lt;My&gt;(a) 正在创建a 的临时副本,而您的副本将2 分配给该成员。您可以使用static_cast&lt;My&amp;&gt;(a) 不进行复制。

删除您有些奇怪的副本和分配后,您还可以使用any 获得相同的结果:

struct My {
    int m_i = 1;
};

int main() {
    any a = My();
    My& b2 = any_cast<My&>(a);
    b2.m_i = 6;
    cout << any_cast<My>(a).m_i << endl;  // copy
    cout << any_cast<My&>(a).m_i << endl; // no copy
}

Output:

6
6

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2013-06-26
    • 2017-07-20
    相关资源
    最近更新 更多