【问题标题】:Why my c++ move constructor was not called? [duplicate]为什么我的 C++ 移动构造函数没有被调用? [复制]
【发布时间】:2018-02-04 21:58:09
【问题描述】:

我编写了一个名为 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() 是一个临时值,所以调用了 move 构造函数,对吧?但是如果我尝试这种方式,它就不行了。

speak(Str("cat"));

它的输出是:

constructor

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

【问题讨论】:

  • 可以省略对复制和移动构造函数的调用。在这种情况下,临时对象没有绑定到引用,因此可以直接在目标中构造对象。

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


【解决方案1】:

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

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

对于speak(Str("cat"));,Str("cat") 是临时的,那么它绑定到右值引用参数s。无需复制任何内容,则无需调用复制/移动构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多