在C ++ 11/14中我们有:返回值优化,移动语义,像unique_ptr这样没有复制文件的类
Q1:当DECLARE_COPY_CTOR等于1或为零时,下面代码片段的正确行为是什么?
Q2:使用MSVC 2013构建的控制台应用程序,用于Win32的DEBUG构建中的代码片段,在控制台中提供:A(), A(A&&),~A(),~A ()。所以看起来像左值参考" a"用来绑定" A&&"。这合法吗?我认为只有临时物体才能成为移动的候选对象。
问题3:在RELEASE构建编译器中选择使用Rvo(所以输出为:A(),〜A())
编译器可以自由选择是" a"在功能范围内是否可以移动?
#include <stdio.h>
#include <iostream>
#include <memory>
#define DECLARE_COPY_CTOR 0
class A
{
public:
A() {puts("A()");}
~A() { puts("~A()"); }
#if DECLARE_COPY_CTOR
A(A&) { puts("A(A&)"); }
#endif
A(A&&) { puts("A(A&&)"); }
A& operator = (A&) { puts("A& operator = (A&)"); return *this; }
};
A F()
{
A a; // here a is lvalue
return a; // here a is still lvalue
}
int main()
{
auto i = F();
return 0;
}
答案 0 :(得分:2)
Q1。当DECLARE_COPY_CTOR等于1或为零时,下面的代码片段的正确行为是什么?
DECLARE_COPY_CTOR
对行为没有影响。不在程序中调用复制构造函数。
Q2。所以看起来像左值参考&#34; a&#34;
a
是左值,但它不是左值参考。
Q2。这是合法的吗?
是的,返回不可复制的本地左值是合法的。它会被移动。
Q3。编译器可以自由选择是&#34; a&#34;在功能范围内是否可以移动?
如果返回的局部变量的类型是可移动的,则必须移动而不是复制。 NRVO适用于这种情况,因此编译器可以自由地忽略移动 - 就像在c ++ 11之前可以自由地删除副本一样。