【发布时间】:2023-04-10 11:12:01
【问题描述】:
以下代码导致 SIGSEGV,我不明白为什么会这样。
#include <iostream>
using namespace std;
struct C {
C(int x) { ptr = new int(x); }
C(C&& c) { ptr = c.ptr; c.ptr = nullptr; }
int* ptr;
};
void foo(int* x, C c) {
cout << *x << endl;
}
int main() {
C c(10);
foo(c.ptr, std::move(c));
return 0;
}
我希望指针 c.ptr 按值传递给函数 foo,但是它的行为就像它通过引用传递一样。
现在,如果我更改参数的顺序:void foo(C c, int* x),那么问题就会消失。 另一种解决方案是在调用 x 之前创建 c.ptr 的本地副本,然后将该本地副本传递给 foo。
我想了解为什么我不能在上面的示例代码中按值传递 c.ptr。
【问题讨论】:
-
你搬到了一个临时的...
标签: c++ move segmentation-fault operator-precedence