gpt4 book ai didi

c++ - 我应该让我的局部变量是常量还是可 move ?

转载 作者:行者123 更新时间:2023-12-03 06:49:16 27 4
gpt4 key购买 nike

我对本地范围内任何对象的默认行为是使其 const .例如。:

auto const cake = bake_cake(arguments);

我尽量减少非功能性代码,因为这会增加可读性(并为编译器提供一些优化机会)。所以在类型系统中也反射(reflect)这一点是合乎逻辑的。

然而,使用 move 语义,这会产生问题:如果我的 cake 怎么办?很难或不可能复制,我想在完成后将其传递出去?例如。:
if (tastes_fine(cake)) {
return serve_dish(cake);
}

据我了解 copy elision rules不保证 cake拷贝将被省略(但我不确定)。

所以,我必须搬家 cake出去:
return serve_dish(std::move(cake)); // this will not work as intended

但是那个 std::movedo nothing useful ,因为它 ( correctly ) 不会转换 Cake const&Cake&& .即使对象的生命周期已接近尾声。我们不能从我们 promise 不会改变的东西中窃取资源。但这会削弱常量正确性。

那么,我怎样才能拥有我的蛋糕并吃掉它呢?

(即我怎样才能拥有常量正确性并从 move 语义中受益。)

最佳答案

我相信不可能从 const move 对象,至少具有标准的 move 构造函数和非 mutable成员。但是,可能有 const自动本地对象和 apply copy elision (即 NRVO)。在您的情况下,您可以按如下方式重写原始函数:

Cake helper(arguments)
{
const auto cake = bake_cake(arguments);
... // original code with const cake
return cake; // NRVO
}

然后,在您的原始函数中,您可以调用:
return serve_dish(helper(arguments));

由于 helper 返回的对象已经是一个非常量的右值,它可以被移出(如果适用,它可以再次被省略)。

Here是演示这种方法的现场演示。请注意,在生成的程序集中没有调用复制/move 构造函数。

关于c++ - 我应该让我的局部变量是常量还是可 move ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61987624/

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