1

使用 gcc 4.7.2 或 4.8.1 编译并运行以下程序时

#include <stdio.h>
#include <functional>

class A
{
public:
    A()
    {
    }
    A(const A& a)
    {
        printf("Copy ctor\n");
    }
    A(A&& a)
    {
        printf("Move ctor\n");
    }
};

int main()
{
    A a;
    auto func = [a] {
    };

    auto newfunc = std::move(func);
    return 0;
}

将给出输出:

Copy ctor
Move ctor

这似乎是完全正常的。

但是,当A a;更改为时const A a;,输出如下:

Copy ctor
Copy ctor

为什么原始变量是否为 const 会影响 lambda 的移动?

FWIW,MSVC2012 总是制作两个副本。

4

1 回答 1

0

由于您没有const A&&移动构造函数,因此不会调用它。由于移动通常会将对象设置为其默认值,因此您通常无法从 const 对象移动。

请记住,如果移动构造函数正确重载,则对象将被移动。例如,尝试运行此版本的代码。

#include <stdio.h>                                                                 
#include <functional>                                                              

class A                                                                            
{                                                                                  
public:                                                                            
    A()                                                                            
    {                                                                              
    }                                                                              
    A(const A& a)                                                                  
    {                                                                              
        printf("Copy ctor\n");                                                     
    }                                                                              
    A(const A&& a)                                                                 
    {                                                                              
        printf("Move ctor\n");                                                     
    }                                                                              
};                                                                                 

int main()                                                                         
{                                                                                  
    const A a;                                                                     
    auto func = [a] {                                                              
    };                                                                             

    const auto newfunc = std::move(func);                                          
    return 0;                                                                      
} 

运行此代码,您会注意到无论是否有const限定,对象都会移动。

于 2013-10-07T17:37:16.293 回答