移动构造函数被调用时会感到困惑吗?

时间:2014-08-24 00:33:00

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

我一直在努力解决这个问题,但我无法找到解释。 假设我有以下代码

class foo
{
public:
    foo()
    {std::cout << "Regular constructor \n";}

    foo( const foo& a)                            //In abscence of const keyword the copy constructor is called
    {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()是临时的,它会返回一个右值。我对么 ?现在在这种情况下,将调用移动构造函数,这是有道理的。但是,如果我从复制构造函数中删除const关键字,则调用复制构造函数而不是移动构造函数。有人可以向我解释为什么会这样吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

VS2012有一个讨厌的扩展,允许临时绑定到左值引用。我们无法使用现代的,符合标准的编译器来重现,实际上 elide 调用copy / move-constructor(因为RVO)。应用选项fno-elide-constructors表明,即使缺少const,它们确实也会调用move-constructor。

答案 1 :(得分:1)

来自cppreference

只要从相同类型的xvalue初始化对象,就会调用移动构造函数,其中包括:

  • 初始化,T a = std :: move(b);或T a(std :: move(b));,其中b的类型为T

  • 函数参数传递:f(std :: move(a));,其中a是T类型,f是void f(T t)

  • 函数返回:返回a;在诸如T f()之类的函数中,其中a是T类型,它具有移动构造函数。