0

move コンストラクターが呼び出されない理由を理解できません。move constructor を呼び出す方法または構文が何であるかを誰でも教えてもらえますか。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <memory>
using namespace std;
class String
{
    char *s;
    int len;
    public:
    String():s(nullptr),len(0){ cout<<"Default "; }
    String(char *p)
    {
        if(p)
        {
            len = strlen(p);
            s = new char[len];
            strcpy(s,p);
        }
        else
        {
            s = nullptr;
            len = 0;
        }
        cout<<"Raw ";
    }
    String(String &p)
    {
        if(p.s)
        {
            len = strlen(p.s);
            s = new char[len];
            strcpy(s,p.s);
        }
        else
        {
            s = nullptr;
            len = 0;
        }
        cout<<"Copy ";
    }
    String & operator = (const String & p)
    {
        if(this != &p)
        {
            delete []s;
            s = nullptr;
            len = 0;
            if(p.len)
            {
                len = p.len;
                s = new char[len];
                strcpy(s,p.s);
            }
        }
        cout<<"Assignment ";
        return *this;
    }
    String( String && p):s(nullptr),len(0)    // move constructor 
    {
        len = p.len;
        s = p.s;
        p.s = nullptr;
        p.len = 0;
        cout<<"Move Copy ";
    }
    String & operator = (String && p)       // move assignment
    {
        if(this != &p)
        {
            delete []s;
            len = 0;
            s = nullptr;
            if(p.len)
            {
                len = p.len;
                s = p.s;
                p.s = nullptr;
                p.len = 0;
            }
        }
        cout<<"Move Assignment ";
        return *this;
    }
    ~String() { delete []s; cout<<"Destructor \n"; }
    void show() { cout<<s<<endl; }
};
int main()
{
   String s1("Something ");
   String s2(s1);
   s1.show();
   s2.show();
   String s4(String("Nothing "));       // Line X
   s4.show();
   String s5;
   s5 = String(s2);
   s5.show();
   return 0;
}

出力:

Raw コピー 何か 何か 生 何もない デフォルト コピー 移動 代入 デストラクタ 何か デストラクタ デストラクタ デストラクタ デストラクタ

4

1 に答える 1

1

これは、ここで説明されているコピー省略の 2 番目のバリアントです: http://en.cppreference.com/w/cpp/language/copy_elision

http://coliru.stacked-crooked.com/a/17f811a0be4ecba3

-fno-elide-constructorsg++ での最適化を無効にすることに注意してください。

出力:

Copy Something 
Something 
Raw Move Copy Move Copy Destructor 
Destructor 
Nothing 
Default Copy Move Assignment Destructor 
Something 
Destructor 
Destructor 
Destructor 
Destructor 
于 2016-04-28T13:46:15.140 に答える