C ++ 11。在return语句

时间:2016-11-23 16:59:16

标签: c++11 move-semantics

在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;
}

1 个答案:

答案 0 :(得分:2)

  

Q1。当DECLARE_COPY_CTOR等于1或为零时,下面的代码片段的正确行为是什么?

DECLARE_COPY_CTOR对行为没有影响。不在程序中调用复制构造函数。

  

Q2。所以看起来像左值参考&#34; a&#34;

a是左值,但它不是左值参考

  

Q2。这是合法的吗?

是的,返回不可复制的本地左值是合法的。它会被移动。

  

Q3。编译器可以自由选择是&#34; a&#34;在功能范围内是否可以移动?

如果返回的局部变量的类型是可移动的,则必须移动而不是复制。 NRVO适用于这种情况,因此编译器可以自由地忽略移动 - 就像在c ++ 11之前可以自由地删除副本一样。