【发布时间】:2020-08-17 12:51:19
【问题描述】:
我有一个类,我在其中删除了复制赋值运算符和复制构造函数,只留下了移动赋值运算符和移动构造函数。例如:
struct Number {
public:
int *pNum;
Number &operator=(const Number &rhs) = delete;
Number(const Number &rhs) = delete;
Number &operator=(Number &&rhs) {
if (&rhs == this) {
return *this;
}
pNum = rhs.pNum;
rhs.pNum = nullptr;
return *this;
}
Number() = default;
Number(Number &&rhs) {
*this = std::move(rhs);
}
~Number() {
delete pNum;
}
};
现在,我想使用 std::move 将此类捕获到 lambda 中。例如:
int main() {
std::function<int(int)> add;
int a = 3;
{
Number n{};
n.pNum = new int;
*n.pNum = 5;
add = [&, capA{std::move(n)}](int) mutable -> int {
int b = *capA.pNum; // 5
return a + b; // 8
};
}
std::cout << add(3);
}
但是,n 似乎是const,因此 c++ 会尝试使用已删除的复制构造函数。我将如何解决这个问题? (回复:https://repl.it/@25GrantY/WeirdLambda)
【问题讨论】: