class TestClass
{
public:
TestClass(){
cout<<"constructor"<<endl;
p = {1,2,3};
cout<<(unsigned int *)(this->p.data())<<endl;
}
TestClass(const TestClass& test): p(std::move(test.p))
{
cout <<"copy constructor"<<endl;
cout<<(unsigned int *)(this->p.data())<<endl;
}
TestClass(TestClass && test): p(std::move(test.p))
{
cout <<"move constructor"<<endl;
cout<<(unsigned int *)(this->p.data())<<endl;
}
private:
std::vector<int> p;
};
int main()
{
TestClass t{};
TestClass p{t};
TestClass s{std::move(p)};
return 0;
}
と出力コンストラクタ下記のアドレスはコピーコンストラクタ以下のものとは異なる、なぜ私は疑問に思ってカスタムクラスのコピーコンストラクタでこのベクターを移動できないのはなぜですか?
constructor
0xb92bf0
copy constructor
0xb915b0
move constructor
0xb915b0
です。私が理解しているものでも、それはコピーコンストラクタですが、私はstd :: moveを使ってrvalue参照を取得し、ベクトルの移動コンストラクタを呼び出す必要があります。
移動するには、ソースオブジェクトを変更する必要があります。 – StoryTeller
コピーコンストラクタは、移動しないコピー用です。それは、コンストラクタを移動するためのものです。このようなセマンティクスを変更すると、そのクラスのコピーコンストラクターがどのように動作するかについてのborkの期待が得られます。 –
'TestClass(const TestClass&test)' 'const'は' move'を 'move'しないと思います。もし' const'を削除すれば、あなたは何を期待しているのでしょうか?なぜ 'copy ctor''が' move'ですか? – PYA