2016-11-23 36 views
0

在C++ 11月14日,我们有:返回值优化,移动语义,一些类,如unique_ptr不具备拷贝构造函数C++ 11。对于移动参考左值语义return语句

Q1:什么是一个正确的行为下面的代码片段时DECLARE_COPY_CTOR等于1还是零?

Q2:在调试生成与MSVC 2013建为代码段下面Win32控制台应用程序给出了在控制台:A(),A(A & &),〜A(),〜A()。所以看起来像左值引用“a”被用来绑定到“A & &”。它合法吗?我认为只有临时的物体才能成为移动的候选人。

Q3:在发布版本的编译器选择使用静脉阻塞(所以输出为:A()〜A())

是编译器自由选择是 “A”,在功能范围是举一个canditate?

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

回答

2

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

DECLARE_COPY_CTOR对行为没有影响。复制构造函数不在程序中调用。第二季度销售价格指数为:

Q2。所以看起来像左值referencce“一”

a是一个左值,但它不是一个左值参考。第二季度销售价格指数为:

Q2。它合法吗?

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

Q3。编译器可以自由选择在功能范围内的“a”是否可以移动?

如果返回局部变量的类型是可移动的,那么它必须移动,而不是复制。 NRVO适用于这种情况,因此编译器可以自由地避免这种移动 - 就像在C++ 11之前可以自由地删除拷贝一样。