0

私は、なぜ移動コンストラクタが呼び出されずに移動代入ができるのか理解できません。私は、行Xでmove関数を使用すると、移動コンストラクタを呼び出していました。誰でも移動コンストラクタを呼び出す方法や構文を教えてください。移動コンストラクタはC++ 11で呼び出されますか?

#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; 
} 

OUTPUT:

生のコピーサムシング 何か 生ナッシング デフォルトコピーが割り当てデストラクタを移動 何か デストラクタ デストラクタ デストラクタ デストラクタ

答えて

1

それはコピーの省略の第2の変形例について説明ですここに:http://en.cppreference.com/w/cpp/language/copy_elision

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

-fno-elide-constructors、それは、G ++での最適化を無効にします。

出力:受け入れ

Copy Something 
Something 
Raw Move Copy Move Copy Destructor 
Destructor 
Nothing 
Default Copy Move Assignment Destructor 
Something 
Destructor 
Destructor 
Destructor 
Destructor 
+0

まあ引数!しかし、コンストラクターの溶出を避ける方法を教えてください。私は、コンパイル時にどのような議論が必要かを意味します。 g ++ -std = C++ 11 ?? copies.cpp -o copies – user3798283

+0

「ノート:-fno-elide-constructor」のところにあります。ご覧のように、出力には指定された行があります。私は、無名の一時的なものを使用しているときにコンパイラが他のどのように強制しないかを確信していません。 – luk32

関連する問題