3 つの質問があります。
関数 f のスコープに割り当てられた A::str のメモリ。グローバル var vec の要素に移動した後、メモリ ブロックは f の範囲外でも安全ですか?
明示的に移動コンストラクターを与えない構造体 B の場合、構造体 A のようなデフォルトのものはありますか?
struct A
{
A(const char* p):str(p){}
A(const A&& a) : str(std::move(a.str))
{
}
string str;
};
struct B
{
B(const char* p):str(p){}
string str;
};
vector<A>vec;
void f()
{
vec.emplace_back(A("hello")); //in vc2010 it will invoke emplace_back(T&&)
}
int _tmain(int argc, _TCHAR* argv[])
{
f();
const char* p = vec[0].str.c_str();
cout << p << endl;
return 0;
}
3.そして、この危険な状況が STL コンテナーでは決して起こらないことを確認できますか?
struct String
{
char* pStr; //allocate on heap
int* someptr; //if point to allocate on stack
size_t len;
String (const String&& s)
{
// something like this:
pStr = s.pStr; //ok,safe
len = s.len;
s.pStr = nullptr;
someptr = s.someptr; //danger
}
};