我正在尝试使用移动和复制构造函数来学习它们,但遇到了一些奇怪的事情,让我有点困惑。基本上,我创建了一个类,并重载了构造函数、析构函数、复制构造函数和移动构造函数,以不同的方式构造它们,以查看构造函数是如何调用的。但我发现了一种调用顺序,结果并不如我所期望。请注意,我在这个例子中完全禁用了优化,并且在VS2012中进行编译。在这种情况下,内联是否仍然可能?
以下是我编写的源代码。
我随后使用以下代码进行测试。
我希望看到的是以下内容。
我实际看到的是这样的。
我得到了如下结果。
以下是我编写的源代码。
class RvalueTest
{
public:
RvalueTest() {
printf("CONSTRUCTOR\n");
}
RvalueTest(const RvalueTest& r) {
printf("COPY CONSTRUCTOR\n");
}
RvalueTest(RvalueTest&& r) {
printf("MOVE CONSTRUCTOR\n");
}
};
__declspec(noinline)
RvalueTest GetRvalueTest() {
return RvalueTest();
}
我随后使用以下代码进行测试。
RvalueTest t1;
RvalueTest t2(t1);
RvalueTest t3(GetRvalueTest());
我希望看到的是以下内容。
CONSTRUCTOR
COPY CONSTRUCTOR
CONSTRUCTOR
MOVE CONSTRUCTOR
我实际看到的是这样的。
CONSTRUCTOR
COPY CONSTRUCTOR
CONSTRUCTOR
看起来最后一行被合并到一个构造函数调用中,如果启用了优化,这是自然而然的。即使我完全关闭了优化,这种情况仍然会发生吗?更奇怪的是,如果我执行以下操作。
RvalueTest t1;
RvalueTest t2(t1);
RvalueTest t3(RvalueTest(GetRvalueTest()));
我得到了如下结果。
CONSTRUCTOR
COPY CONSTRUCTOR