为什么编译器在调用move后选择copy ctor

时间:2018-03-08 17:36:45

标签: c++ copy-constructor rvalue-reference move-constructor


对于下面的代码,我知道因为我实现了一个复制构造函数,默认的移动被编译器阻止了,我不明白为什么编译器会选择复制构造函数,而不是发出错误?
如果不存在右值ref函数,则右值引用可以作为参考函数的参数吗? 如果没有,这里发生了什么?

#include <iostream>

using namespace std;

class A{
    public:

        A(){printf("constructor\n");}
        A(const A& a){printf("copy constructor");}
};

int main()
{ 
    A a;
    A b = std::move(a);
    return 1; 
}

输出结果为:

constructor
copy constructor

由于

2 个答案:

答案 0 :(得分:3)

原因是 rvalue表达式可以绑定到const 左值引用的函数参数。

另请注意,const 右值表达式不能绑定到右值引用:

class A{
    public:    
        A(){printf("constructor\n");}
        A(const A& a){printf("copy constructor");}
        A(A&&) = default; // <-- has move ctor
}; 

int main()
{ 
    const A a; // <-- const!
    A b = std::move(a); // <-- copy not move!!!
    return 1; 
}

上面的代码仍会调用复制构造函数,即使有一个移动构造函数。

答案 1 :(得分:2)

from win32com.client import Dispatch def openfile(): Application = Dispatch("PowerPoint.Application") Application.Visible = True Test = Application.Presentations.Open(r"C:\transfer\hello world.pptx", ReadOnly=True) if __name__ == "__main__": openfile() 将获取您的命名值并将其转换为右值表达式,仅此而已。

而且,就像任何其他右手边缘一样,如果它不能被移动,它就会被复制。

类型std::move的左值可以绑定到T就好了。