- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道用代码来做是一件愚蠢的事情……但是为了理解,请考虑以下几点:
#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/
我正在编写一个插件,有一个ajax调用向用户显示数据。 如果用户想在ajax成功时添加一些js?他可以从他的 js 脚本中做到这一点吗,比如定位这个 ajax 成功事件。 例如: $(documen
我有 html 代码,例如 - x 最初插入 div 'insert_calendar_eda_form'。 Javascript代码 calendar_eda_add
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我已经使用命令 sudo start myservice 启动了一个 upstart 服务。我想要一种方法,以便稍后我(或任何人)可以检查该服务是否已启动并正在运行。检查它的命令是什么? 最佳答案 找
我是一名优秀的程序员,十分优秀!