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:
生のコピーサムシング 何か 生ナッシング デフォルトコピーが割り当てデストラクタを移動 何か デストラクタ デストラクタ デストラクタ デストラクタ
まあ引数!しかし、コンストラクターの溶出を避ける方法を教えてください。私は、コンパイル時にどのような議論が必要かを意味します。 g ++ -std = C++ 11 ?? copies.cpp -o copies – user3798283
「ノート:-fno-elide-constructor」のところにあります。ご覧のように、出力には指定された行があります。私は、無名の一時的なものを使用しているときにコンパイラが他のどのように強制しないかを確信していません。 – luk32