为什么没有调用我的c ++移动构造函数?

时间:2017-08-27 13:10:06

标签: c++ c++11 constructor rvalue-reference move-constructor

我编写了一个名为Str的简单类,并覆盖了它的构造函数,复制构造函数和移动构造函数。

class Str
{
public:
    Str(const char* s) :m_data(NULL)
    {
        printf("constructor\n");
        int size = strlen(s) + 1;
        m_data = new char[size];
        strncpy_s(m_data, size, s, size);
    }

    Str(const Str &s) 
    {
        printf("copy constructor\n");
        int size = strlen(s.m_data) + 1;
        m_data = new char[size];
        strncpy_s(m_data, size, s.m_data, size);
    }

    Str(Str &&s)
    {
        printf("move constructor\n");
        m_data = s.m_data;
        s.m_data = NULL;
    }

public:
    char* m_data;
};

现在我有一个想要调用它的移动构造函数的函数:

void speak(Str &&s)
{
}
Str getStr()
{
    Str s("cat");
    return s;
}

如果我这样试试,可以调用移动构造函数。

speak(getStr());

它的输出是:

constructor
move constructor

这是因为getStr()是一个临时值,所以调用了移动构造函数,对吧?但如果我这样做,就不能。

speak(Str("cat"));

它的输出是:

constructor

我不明白的是Str(“cat”)也是一个临时值。但它只叫构造函数!为什么?

1 个答案:

答案 0 :(得分:1)

  

我不明白的是Str(“cat”)也是一个临时值。但它只叫构造函数!为什么?

首先,绑定到引用不会导致复制,即不会调用复制/移动构造函数。

对于speak(Str("cat"));Str("cat")是临时的,然后它绑定到rvalue-reference参数s。没有什么需要复制,因此不需要调用复制/移动构造函数。