对于下面的代码,我知道因为我实现了一个复制构造函数,默认的移动被编译器阻止了,我不明白为什么编译器会选择复制构造函数,而不是发出错误?
如果不存在右值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
由于
答案 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
就好了。