【发布时间】:2012-02-13 20:41:02
【问题描述】:
我一直在使用右值引用和移动语义进行测试,并希望确保我了解何时应该删除副本以及何时应该遵循移动语义。
鉴于以下
class NRVCA
{
public:
NRVCA(int x):
{}
NRVCA(const NRVCA & Rhs)
{}
NRVCA& operator=(const NRVCA& dref)
{}
};
NVCRA GetATemp()
{
return NVCRA(5);
}
NVCRA GetACopy()
{
NVCRA ret(5);
...
return ret;
}
int main()
{
//This call will be elided allays and invoke the single param constructor
NVCRA A = GetATemp();
//This call will be a traditional copy the complier may elide this
// if so the work will be done inline
NVCRA B = GetACopy();
}
在这种情况下,移动语义不起作用,与 c++11 中的 C++03 的唯一区别是编译器不允许省略它们,而是要求它们省略。
所以 问题 1. 在什么情况下我可以保证复制构造函数会或不会被省略。
问题2.有没有办法强制编译器不省略。
问题 3. 假设您有逻辑上一致的复制操作,我不希望编译器这样做有什么合乎逻辑的原因吗?
问题 4. 如果我定义了一个移动构造函数,那么在无论如何都没有删除副本的情况下会发生移动。这是否会影响我的课程设计。
【问题讨论】:
-
A是什么类型?应该是NRVCA?