在移动构造函数的abscence中调用复制构造函数?这是为什么?

Raj*_*war 2 c++ move-constructor c++11

我正在阅读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;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我做这样的事情

foo a = myfunction();
Run Code Online (Sandbox Code Playgroud)

我知道将调用move构造函数,因为myfunction()返回一个rvalue类型.现在我注意到如果我从我的类中删除移动构造函数代码,则调用复制构造函数.我的问题是为什么会发生这种情况?如果myfunction的返回类型是foo &&并且复制构造函数接受foo,那么为什么要调用复制构造函数?我正在使用Vs2012.

fre*_*low 7

如果myfunction的返回类型是 foo&&

但事实并非如此!返回类型是foo.并const foo&愉快地绑定到一个foo右值.

提示:"rvalue"和"rvalue reference"是两个相关但不同的概念.(请记住,在将rvalue引用引入语言之前,C++已经有了几十年的rvalues.)