class x{
public:
x( moveClass&& item) {
std::cout << 123 << std::endl;
}
x() = default;
};
int main(){
x(x());
}
如上的代码, 不应该输出123
吗, 为什么什么都没有输出... 这种情况到底算调用了哪种构造方法.
大家讲道理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;
}
阿神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 ) {
// ...
}
}