[英]In abscence of move constructor the copy constructor is called ? Why is that?
我正在閱讀C ++ 11,我有以下問題。 假設我有以下粗略代碼
class foo
{
public:
foo()
{std::cout << "Regular constructor \n";}
foo(const foo& a)
{std::cout << "Copy constructor \n";}
foo& operator=(const foo& a)
{std::cout << "Copy Assignment operator \n";}
foo(foo&& a)
{
std::cout << "Move constructor \n";
}
foo& operator=(foo&& a)
{std::cout << "Move Assignment operator \n";}
int a;
};
foo myfunction()
{
foo d;
d.a =120;
return d;
}
現在,如果我做這樣的事情
foo a = myfunction();
我知道將調用move構造函數,因為myfunction()返回一個rvalue類型。 現在我注意到如果我從我的類中刪除移動構造函數代碼,則調用復制構造函數。 我的問題是為什么會發生這種情況? 如果myfunction的返回類型是foo &&並且復制構造函數接受foo,那么為什么要調用復制構造函數? 我正在使用Vs2012。
如果myfunction的返回類型是
foo&&
但事實並非如此! 返回類型是foo
。 並且const foo&
愉快地綁定到foo
rvalue。
提示:“rvalue”和“rvalue reference”是兩個相關但不同的概念。 (請記住,在將rvalue引用引入語言之前,C ++已經有了幾十年的rvalues。)
根據C ++ 11標准的第12.8 / 9段:
如果類
X
的定義沒有顯式地聲明一個移動構造函數,那么當且僅當一個移動構造函數被隱式聲明為默認值時-
X
沒有用戶聲明的復制構造函數,
-X
沒有用戶聲明的復制賦值運算符,
-X
沒有用戶聲明的移動賦值運算符,和
-X
沒有用戶聲明的析構函數。
由於您具有用戶聲明的復制構造函數,因此移動構造函數不可訪問,並且它將回退到調用復制構造函數。
如果
myfunction
的返回類型是foo&&
並且復制構造函數接受foo&
那么為什么要調用復制構造函數?
這里有兩件事: myfunction
按值返回foo
,而不是foo&&
。 此外,你的構造函數接受const foo&
並且實際上可以綁定到rvalues(這不是這里發生的事情)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.