簡體   English   中英

在移動構造函數的abscence中調用復制構造函數? 這是為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM