gpt4 book ai didi

c++ - *this 的 std::move 和稍后对类方法和字段的访问

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

我知道用代码来做是一件愚蠢的事情……但是为了理解,请考虑以下几点:

#include <iostream>
#include <memory>
#include <utility>

struct S;
void f( S && s );

struct S {
S() : i{std::vector<int>(10, 42)} {}
std::vector<int> i;
void call_f() { f( std::move(*this) ); }
void read() { std::cout << " from S: " << i.at(3) << std::endl; }
};

void f(S && s) { std::cout << " from f: " << s.i.at(3) << std::endl; }

int main() {
S s;
s.call_f();
s.read();
}

这为 g++ 和 clang++ 编译和运行,而我希望 std::vector<int>被 move 。在 gdb 中运行它并查看内存显示 s.i 的地址在 std::move 之后未设置为零,虽然我预计对于非 POD 类型它会。因此,我预计这段代码会出现段错误。
任何人都可以向我解释这种行为吗?为什么不是 s其内部字段也无效?它是 this 的功能吗? ?

最佳答案

std::move 实际上并没有 move 任何东西,它只是转换为一个右值以允许 move (有点用词不当,但是嘿,我们被卡住了现在就用它)。

如果您要进行实际的 move 构造,您很可能会看到边界检查 std::vector::at 的异常。

void f(S && s) { 
S steal = std::move(s);
std::cout << " from f: " << s.i.at(3) << std::endl;
}

GCC 6.1 给了我这个

terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 3) >= this->size() (which is 0)
bash: line 7: 18043 Aborted (core dumped) ./a.out

关于c++ - *this 的 std::move 和稍后对类方法和字段的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180760/

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