4

次のコード スニペットがあります。この移動コンストラクターがメイン関数のすべてのケースで呼び出されない理由を誰かが知っていますか? とにかくコンパイルするのはなぜですか?代入演算子は非公開ですか? ここにリンクがあります: 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 がないことを願っています)。

4

2 に答える 2