class x{ public: x( moveClass&& item) { std::cout << 123 << std::endl; } x() = default; }; int main(){ x(x()); }
如上的代码, 不应该输出123吗, 为什么什么都没有输出... 这种情况到底算调用了哪种构造方法.
123
人生最曼妙的风景,竟是内心的淡定与从容!
你的程式碼不應該輸出123吧。那是個函數聲明,並沒有呼叫x(moveClass&& item)。我的理解是移動構造函數是用在右值身上,減少臨時構造函數和析構函數的調用的,當你用右值來調用構造函數的時候,移動構造函數就可以拿來調用。
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,編譯運行應該會報錯;下面這份是我的測試程式碼,你也可以試試看,所以你的那一行沒有呼叫移動構造函數!
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; }
#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 ) { // ... } }
試試x{x{}}
你的程式碼不應該輸出
123
吧。那是個函數聲明,並沒有呼叫x(moveClass&& item)
。我的理解是移動構造函數是用在右值身上,減少臨時構造函數和析構函數的調用的,當你用右值來調用構造函數的時候,移動構造函數就可以拿來調用。上面的程式碼,因為我傳的是個右值進去,所以就會呼叫建構函式。 http://stackoverflow.com/ques...這裡面討論了什麼時候用移動建構子。
題主! ! !重大發現,我查資料,然後自己做試驗,發現
x(x())
是一個函數宣告!你在你的x(x())
下面再聲明一個x a
,編譯運行應該會報錯;下面這份是我的測試程式碼,你也可以試試看,所以你的那一行沒有呼叫移動構造函數!copy assignment operator 應該這麼寫:
試試x{x{}}