次のコード スニペットがあります。この移動コンストラクターがメイン関数のすべてのケースで呼び出されない理由を誰かが知っていますか? とにかくコンパイルするのはなぜですか?代入演算子は非公開ですか? ここにリンクがあります: http://ideone.com/bZPnyY
#include <iostream>
#include <vector>
class A{
public:
A(int i){
std::cout << "Constructor "<< i <<std::endl;
for(int l = 0; l<i;l++){
vec.push_back(l);
}
};
A(A && ref): vec(std::move(ref.vec))
{
std::cout << "Move constructor"<<std::endl;
}
A & operator=(A && ref){
if(this != &ref){
vec = std::move(ref.vec);
}
std::cout << "Move assignment"<<std::endl;
return *this;
}
std::vector<int> vec;
private:
A(const A & ref);
A(A & ref);
A & operator=(A & ref);
};
A makeA(){
A a(3);
return a;
}
int main(){
A b1(makeA()) ;
A b2 = makeA();
A b3 = A(3);
A b4(A(3));
std::cout << b4.vec[2] << std::endl;
};
出力:
コンストラクター 3
コンストラクター 3
コンストラクター 3
コンストラクター 3
2
応答へのいくつかの追加:追加すると
std::pair<int,A> a(3,A(3));
次に、移動コンストラクターが呼び出されます (したがって、NRVO がないことを願っています)。