未调用 C++ 移动构造函数

C++ move constructor not called

在以下(借用的)示例中,在我的环境中从未调用移动构造函数:

#include <iostream>

class MyClass {
  public:
      MyClass()
      {
          std::cout << "default constructor\n";
      }
      MyClass(MyClass& a)
      {
          std::cout << "copy constructor\n";
      }

      MyClass(MyClass&& b)
      {
          std::cout << "move constructor\n";
      } 
};  

void test(MyClass&& temp)
{
    MyClass a(MyClass{}); // calls MOVE constructor as expected
    MyClass b(temp); // calls COPY constructor...  
}

int main()
{
    test(MyClass{});
    return 0;
}

我的输出是: 默认构造函数 默认构造函数 复制构造函数

我使用 XCode 版本 9.1,不应该在右值引用上调用移动构造函数吗?我在这里错过了什么?

约翰.

What am I missing here?

关键是所有有名字的东西都是左值。

这意味着命名右值引用本身是左值并且temp来自:

void test(MyClass&& temp)

也是左值。所以移动构造函数没有被调用。

如果要调用移动构造函数,请使用std::move:

void test(MyClass&& temp)
{
    // ...
    MyClass b(std::move(temp)); // use std::move here 
}

顺便说一句,

 MyClass(MyClass& a)
 {
     std::cout << "copy constructor\n";
 }

不是复制构造函数,因为复制构造函数的形式为:

MyClass(const MyClass& a) { ... }