gpt4 book ai didi

c++ - move 赋值运算符异常

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:15 25 4
gpt4 key购买 nike

考虑:

struct Boo {
Boo (std::string v) : src {v} {}

Boo (const Boo&) = delete;
Boo& operator= (const Boo&) = delete;

Boo (Boo&& b) : src {std::move (b.src)} {}

Boo& operator= (Boo&& b) {
if (this != &b) {
foo ();
src = std::move (b.src);
}
return *this;
}

void show () {
std::cout << "|" << src << "|" << std::endl;
}

void foo () {
throw 1;
}

std::string src {};
};

和用法:

int main(int argc, char** argv) {

Boo s {"Boo1"};
Boo p {"Boo2"};

try {
p = std::move (s); // (X)
}
catch (...) {}

s.show ();
p.show ();

return 0;
}

输出看起来像这样:

如果在 move 赋值运算符中调用了foo()

|Boo1|
|Boo2|

如果 foo() 没有被调用

|Boo2|
|Boo1|

问题:

当 move 赋值运算符抛出异常时,s 会发生什么?它是否像在第 (X) 行中使用 std::move() 之前一样具有以前的内容,或者内容已完全 move 到 b(函数参数)?

为什么在这两种情况下输出都显示内容仍在 std::string 对象中?

最佳答案

当抛出异常时,正常的执行会立即停止,并且调用堆栈会展开。直到第一个有效的 catch。对于您的情况,这意味着一旦您 throw 继续执行 foo 和赋值运算符函数就会停止,程序将转到 catchmain 函数中,换句话说,没有任何事情会改变对象。

move std::string 对象会使源处于有效但未指定 状态。应该注意的是, move 通常是通过交换源和目标来实现的,这将解释您看到的行为。

关于c++ - move 赋值运算符异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34398675/

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