2017-08-27 130 views
1

我写了一个名为Str的简单类,并覆盖了它的构造函数,复制构造函数和移动构造函数。为什么我的C++移动构造函数未被调用?

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( “猫”)是一个临时的价值,以及。但它只是叫做构造函数!为什么??

+1

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

回答

1

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

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

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

相关问题