関数 f を考える
void f(const std::string& s) {
...
}
次のような固定文字列で f を呼び出しても安全ですか。
f("abc");
std::string
暗黙的に構築された fromの存続期間は、"abc"
への呼び出しがf()
終了するまでです。終了後にその参照を別の場所に保持しない限り、f()
完全に安全です。
std::string const *pstr;
void f(std::string const &s)
{
s.length(); // safe. s has an instance backing
// it for the lifetime of this function.
pstr = &s; // still technically safe, but only if you don't
// dereference pstr after this function completes.
}
f("abc");
pstr->length(); // undefined behavior, the instance
// pstr pointed to no longer exists.
引数への参照またはポインターをどこかに保存せず、関数から戻った後もそれが残っていることを願っていると仮定すると、問題ありません。関数が呼び出されると、一時的std::string
に作成されます。関数が実行されます。
関数が戻った後は使用しなければ安全です。
このため、別の文字列オブジェクトを (関数が戻る前に) 初期化するために使用することも安全です。たとえこの文字列オブジェクトがより長く存続する (そしてより長く使用される) 場合でもです。