Rod*_*tes 2 c++ constructor move
移动构造函数通常的实现方式是这样的:
class Test {
public:
    int *ptr;
    Test() {
    }
    Test(Test&& t) {
        ptr = t.ptr;
        t.ptr = nullptr;
    }
};
int main() {
    Test t = Test(Test());
    return 0;
}
购买为什么我们不能像这样实现它们:
class Test {
public:
    int *ptr;
    Test() {
    }
    Test(Test& t) {
        ptr = t.ptr;
        t.ptr = nullptr;
    }
};
int main() {
    Test t = Test(Test());
    return 0;
}
第二段代码似乎运行得很好。我不明白为什么我们不能那样做。
您不能将非const左值引用绑定到右值(即,不能使用纯右值或x值),因此您的特殊构造函数不能与临时变量或移动操作一起使用。
Test t;
Test t2(std::move(t)); // error: tries to bind a non-const& to an xvalue
在您的情况下,它会编译,因为您使用的是 C++17 或更高版本,其中Test t = Test(Test());相当于Test t;因为强制复制/移动省略1)。您的特殊构造函数根本没有被使用。只有默认构造函数是。
1) t由相同类型的纯右值初始化,因此直接= T(...)初始化t。请参阅cppreference 上的复制省略
你当然可以做到。你的代码的用户(包括未来的你)会诅咒你。
Test t1;
Test t2(t1); // Surprise! t1 no longer holds a valid pointer
对于采用右值的移动构造函数,您必须说您想要将其炸毁:
Test t1;
Test t2(std::move(t1)); // Okay, says what it does