c++ - 在没有移动构造函数的情况下,复制构造函数被调用?这是为什么?

标签 c++ c++11 move-constructor

我正在阅读 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();

我知道移动构造函数将被调用,因为 myfunction() 返回右值类型。 现在我注意到,如果我从类中删除移动构造函数代码,则会调用复制构造函数。我的问题是为什么会这样?如果 myfunction 的返回类型是 foo&& 并且复制构造函数接受 foo& 那么为什么要调用复制构造函数?我正在使用 Vs2012。

最佳答案

If the return type of myfunction is foo&&

但事实并非如此!返回类型是 fooconst foo& 愉快地绑定(bind)到 foo 右值。

提示:“右值”和“右值引用”是两个相关但不同的概念。 (请记住,在将右值引用引入该语言之前,C++ 已有数十年的右值。)

关于c++ - 在没有移动构造函数的情况下,复制构造函数被调用?这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25465703/

相关文章:

c++ - C++中移动构造函数的调用

c++ - Visual Studio 2017 是否需要显式移动构造函数声明?

java - 我怎样才能避免在 java 中做很多 if?

c++ - 为什么要隐式定义复制赋值运算符?

c - 像 C++ constexpr 一样的 ANSI-C 常量表达式函数?

c++ - 只提供一个 move 构造函数是不是不好的形式?

c++ - 如何在 C++ 容器中向左移动元素(以实现删除)?

c++ - 如何在类中进行多个类型转换重载

javascript - 浏览器中的mp3流解码

c++ - 这是优化器的怪癖还是语言规则禁止优化的结果?