gpt4 book ai didi

c++ - 调用返回右值引用的函数

转载 作者:行者123 更新时间:2023-12-02 10:03:55 26 4
gpt4 key购买 nike

我想我了解大多数右值的东西,但是当我尝试实现以下代码时,我得到了段错误(核心转储):(也许我仍然缺少一些细节,希望有任何帮助!

我有这个struct Mode在我的标题中:

#include <memory>
#include <iostream>

struct Mode
{
explicit Mode(const int id_in, const int p_val=1) : id{id_in}, p{new int{p_val}} {
std::cout << "explicit param default ctr called..." << std::endl;

}
Mode() : id{42}, p{nullptr}{
std::cout << "default ctr called..." << std::endl;
}

Mode&& clone() {
Mode m(*this);
m.p.reset(new int{*m.p});
return std::move(m);
}
int id;
std::shared_ptr<int> p;
};


在 main.cpp 我这样做:
int main()
{
Mode m{42, 43};
Mode m2;
m2 = m.clone();

cout << m.p << endl;
cout << m2.p;
}
m2 = m.clone() 行中的详细情况?我目前了解的是:在 clone()它会创建 m 的临时拷贝使用复制构造函数 Mode m(*this) , 和 std::move 这个临时对象的内容,最后返回给它的调用者 m2 .在 main.cpp 中,我将右值分配给 m2使用移动分配?在这一步之前我不太确定......

最佳答案

您的代码具有未定义的行为。

您正在绑定(bind)局部变量 m到返回的右值引用;当函数返回时,局部变量会被销毁,所以它返回的总是一个悬空引用。

and std::move the contents of this temp object



你可能误会了 std::move ;它只是将参数转换为右值,但实际上不会执行移动操作。

关于c++ - 调用返回右值引用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61206009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com