У меня есть класс, в котором я удалил оператор назначения копирования и конструктор копирования, оставив только оператор назначения перемещения и конструктор перемещения. Например:
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
для захвата этого класса в лямбду. Например:
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 ++ попытается использовать конструктор удаленной копии. Как бы я это исправить? (REPL: https://repl.it/@25GrantY / WeirdLambda )