gpt4 book ai didi

c++ - 为什么不能 move 这些变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:18 26 4
gpt4 key购买 nike

C++ move 语义中似乎错失了很多机会。我想了解这些背后的基本原理,以及为什么标准在定义以下情况下何时应 move 变量时没有更积极地定义:

string f()
{
string s;
return s + " ";
}

这调用了operator+(const string&, const char*),而不是operator+(string&&, const char*),我相信是因为s是一个左值。难道标准不能说,在函数中最后一次使用局部变量时,该变量被认为是可 move 的吗?

我觉得有点类似的例子:

struct A { A(string&&); };
string g()
{
string s;
return s; // s is moved
}
A h()
{
string s;
return s; // s can't be moved!
}

g 使用 move 语义将数据从 s move 到返回值,但是 h 没有编译,因为 s h 中没有 move 。我相信这是因为该标准有一个 g 的特殊情况,它本质上说如果您返回一个与返回类型完全相同类型的局部变量,则该变量将被 move 。为什么不规定如果您返回一个局部变量,无论其类型如何,它都会被 move ?

最佳答案

我敢肯定这两个例子都需要 move ,但是有人会想出另一种情况,他们认为 s 最后一次被使用是“显而易见的”,因此应该 move 。

最终,您将拥有定义编译器需要执行哪些数据流分析的标准。作者决定保守地划清界限,允许在这方面实现愚蠢。程序员总是可以编写 std::move 将拷贝更改为 move 。

标准的另一种可能性是未指定是否 move 或复制对象,前提是代码不再使用它们。这将使实现尽可能聪明。我敢肯定这不是一个好主意:在实践中,用户通常不关心他们的对象是否被 move ,但他们有时需要解决这个问题。

关于c++ - 为什么不能 move 这些变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13630286/

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