以下のコードは、一見問題なくビルド、コンパイル、実行(C++、mingw)されます。しかし、関数が参照によって引数を取る場合でも、関数のパラメータ リスト内の初期化リストを使用して構築されたオブジェクトがその関数のスコープ内で存続することが保証されますか?
そうでない場合、関数のパラメータ リスト (引数を参照によって受け取る) で初期化リストを使用してオブジェクトを作成すると、すぐに破棄されるため危険であるというのは本当ですか。この場合、関数にはコピーはなく、別のプロセスによって再割り当てされる可能性のあるメモリへの参照があります。
struct S
{
S() : a(0), b(0) {}
S(int a, int b) : a(a), b(b) {}
int a;
int b;
};
void foo(const S& s)
{
std::cout << "s.a = " << s.a << std::endl;
std::cout << "s.b = " << s.b << std::endl;
}
int main()
{
foo({4,5}); // <-- What is the scope of the struct initialized here?
return 0;
}
ベストアンサー1
によるとcppreference [有効期間]:
すべての一時的なオブジェクトは完全な表現を評価する最後のステップとして破壊される一時オブジェクトが作成されたポイントが(字句的に)含まれており、複数の一時オブジェクトが作成された場合は、作成順序とは逆の順序で破棄されます。評価が例外のスローで終了した場合でも同様です。
つまり、一時的なオブジェクトは破棄されることになります後関数は返されたので、完全に安全です。