gpt4 book ai didi

c++ - move 语义和返回 const 值

转载 作者:太空狗 更新时间:2023-10-29 20:00:24 24 4
gpt4 key购买 nike

我有将所有内容作为“const”值返回的习惯(?!?!?)。像这样...

struct s;

s const make_s();

s const &s0 = make_s();
s const s1 = make_s();

通过 move 操作和右值引用以及以下函数...

void take_s(s &&s0);
void take_s(s const &&s0); // Doesn't make sense

我写不下去了

take_s(make_s());

我开始使用返回 const 值的约定的主要原因是为了防止有人编写这样的代码......

make_s().mutating_member_function();

用例如下...

struct c_str_proxy {
std::string m_s;

c_str_proxy(std::string &&s) : m_s(std::move(s)) {
}
};

c_str_proxy c_str(std::string &&s) {
return c_str_proxy(s);
}

char const * const c_str(std::string const &s) {
return s.c_str();
}

std::vector < std::string > const &v = make_v();
std::puts(c_str(boost::join(v, ", ")));

std::string const my_join(std::vector < std::string > const &v, char const *sep);

// THE FOLLOWING WORKS, BUT I THINK THAT IS ACCIDENTAL
// IT CALLS
//
// c_str(std::string const &);
//
// BUT I THINK THE TEMPORARY RETURNED BY
//
// my_join(v, "; ")
//
// IS NO LONGER ALIVE BY THE TIME WE ARE INSIDE
//
// std::puts
//
// AS WE ARE TAKING THE "c_str()" OF A TEMPORARY "std::string"
//
std::puts(c_str(my_join(v, "; ")));

看起来好像“返回 const 值”和 r 值引用在这个特定用例中没有混合。是吗?

**Edit 0: Extra question...**

该对象无论如何都是临时的。为什么“const”应该阻止 move ?为什么我们不能 move “const”临时变量?

最佳答案

您有两个相互冲突的目标。一方面,您希望防止对返回的对象进行修改,但另一方面,您希望允许进行修改(这就是一个 move 操作是。它修改源对象,通过窃取它的内部资源)。

你需要下定决心。您希望对象是不可变的,还是希望人们能够修改它?

就其值(value)而言,我真的看不出首先返回 const temporaries 会带来什么好处。是的,您可以防止人们对其调用可变成员函数,但是您为什么要这样做?充其量,能够这样做是有用的,而在最坏的情况下,这是一个很容易避免的错误。

而你所做的事情并没有多大意义。 临时 的全部要点是它会在一瞬间消失,所以谁在乎它是否被修改了?

右值引用和 move 语义背后的整个思想是临时对象是临时的,因此可以在不伤害任何人的情况下对其进行修改。

关于c++ - move 语义和返回 const 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7138780/

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