首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用rvalue引用的C++移动构造函数

未调用rvalue引用的C++移动构造函数
EN

Stack Overflow用户
提问于 2016-07-16 00:44:42
回答 1查看 1.2K关注 0票数 3
代码语言:javascript
复制
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... not expected...? 
}

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

对于上面的代码,我预期test()中的两个对象创建都会调用move构造函数,因为b是一个r值引用类型(MyClass&)。

但是,将b传递给MyClasss构造函数并不像预期的那样调用move构造函数,而是调用copy构造函数。

为什么第二种情况调用复制构造函数,即使传递的参数是MyClass&(r-值引用)?

我在用gcc 5.2.1。要复制我的结果,您必须将-fno-elide-constructors选项传递给gcc,以禁用复制省略优化。

代码语言:javascript
复制
void test(MyClass&& temp)
{
    if (std::is_rvalue_reference<decltype(temp)>::value)
        std::cout << "temp is rvalue reference!!\n";
    else
       std::cout << "temp is NOT rvalue!!\n";
}

上面的代码输出"temp是rvalue引用“,即使temp是命名的。

temp的类型是rvalue引用类型。

EN

回答 1

Stack Overflow用户

发布于 2016-07-16 00:49:31

void ( MyClass && temp) { MyClass a(MyClass{});//调用按预期移动构造函数MyClass b(temp);//调用复制构造函数出乎意料.?

这是因为,temp (因为它有名称)是对rvaluelvalue引用。若要在任何时候将其视为rvalue,请调用std::move

代码语言:javascript
复制
void test(MyClass&& temp)
{
    MyClass a(MyClass{}); // calls MOVE constructor as expected
    MyClass b(std::move(temp)); // calls MOVE constructor... :-) 
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38406675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档