搜尋

首頁  >  問答  >  主體

c++移动构造函数什么时候会被调用?

class x{
public:
    x( moveClass&& item) {
        std::cout << 123 << std::endl;
    }
    
    x() = default;
};


int main(){
    x(x());
}

如上的代码, 不应该输出123吗, 为什么什么都没有输出... 这种情况到底算调用了哪种构造方法.

黄舟黄舟2885 天前720

全部回覆(3)我來回復

  • 大家讲道理

    大家讲道理2017-04-17 14:34:10

    你的程式碼不應該輸出123吧。那是個函數聲明,並沒有呼叫x(moveClass&& item)。我的理解是移動構造函數是用在右值身上,減少臨時構造函數和析構函數的調用的,當你用右值來調用構造函數的時候,移動構造函數就可以拿來調用。

    #include <iostream>
    
    using namespace std;
    
    class x
    {
    public:
        x(int&& val)
        {
            cout << 123 << endl;
        }
        x() = default;
    };
    
    int main()
    {
        x(567);
    
        return 0;
    }
    

    上面的程式碼,因為我傳的是個右值進去,所以就會呼叫建構函式。 http://stackoverflow.com/ques...這裡面討論了什麼時候用移動建構子。
    題主! ! !重大發現,我查資料,然後自己做試驗,發現x(x())是一個函數宣告!你在你的x(x())下面再聲明一個x a,編譯運行應該會報錯;下面這份是我的測試程式碼,你也可以試試看,所以你的那一行沒有呼叫移動構造函數!

    #include <iostream>
    #include <utility>
    
    using namespace std;
    
    class x
    {
    public:
        x(int&& val)
        {
            cout << "sdfs";
        }
        x()=default;
    };
    
    int func()
    {
        return 123;
    }
    class AA
    {
    public:
        AA(int&&){cout << "no" << endl;}
    };
    
    //x(func())
    //{
    //    cout << "function called" << endl;
    //}
    //AA(func());
    AA(funcall())
    {
        cout << "here\n";
    }
    
    //x(x());
    //AA(x());
    
    int main()
    {
        
        //(x)func();
        x(123);
        x(func());
        //AA(123);
        //funcall();
        return 0;
    }

    回覆
    0
  • 阿神

    阿神2017-04-17 14:34:10

    #include <iostream>
    #include <utility>
    
    class X {
    public:
        X( X&& item) {
            std::cout << 123 << std::endl;
        }
    
        X() = default;
    };
    
    
    int main() {
        X(X()); // X(std::move(X())); 这个会输出 123
    }

    copy assignment operator 應該這麼寫:

    class X {
        X operator=( const X &rhs ) {
            // ...
        }
    }

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:34:10

    試試x{x{}}

    回覆
    0
  • 取消回覆