このサンプルの場合:
// test.cpp
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
class mystring : public string { public:
mystring() = default;
mystring(const char* c) : string(c) {}
mystring(mystring& m) : string(m) { cout << "Reference" << endl; }
mystring(mystring const & m) : string(m) { cout << "Const reference" << endl; }
mystring(mystring&& m) : string(move(m)) { cout << "Move" << endl; }
};
int main() {
mystring a;
vector<mystring> v{ a };
}
出力は次のとおりです。
$ g++ --version | grep "g++"
g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
$ g++ -std=c++11 -fno-elide-constructors test.cpp
$ ./a.out
Reference
Move
Const reference
しかし、vをr値で初期化すると:
vector<mystring> v{"hello"};
出力は次のとおりです。
$ g++ -std=c++11 -fno-elide-constructors test.cpp
$ ./a.out
Const reference
つまり、コピーはありません。r値の場合:
vector <mystring> v{mystring()};
出力:
$ g++ -std=c++11 -fno-elide-constructors test.cpp
$ ./a.out
Move
Move
Const reference
私は2つのことを理解していません:
- 生の文字列がない場合、2番目の移動(最初のコピー/移動の前)が実行されるのはなぜですか?
- なぜ生の文字列では、「mystring」のコピーが実行されないのですか?