(元の質問をより意味のあるものに変更しました)
returnステートメントに関して、Raiiオブジェクトはreturnステートメントの前/後/間で破棄されますか?
例えば
size_t advance() {
boost::lock_guard<boost::mutex> lock(mutex_);
return value_++; // is lock destroyed after increment?
}
ありがとうございました
変更された質問に答えるには、次のコードを指定します。
return X;
Xは、返品が行われる前に常に評価されます。次に、関数のネストされたすべてのスコープが、最も内側から最も外側の順に、各出口で適切に呼び出されて、終了するのと同じです。
デストラクタを使用して独自の単純なクラスを作成することで、これを簡単にテストできます。
class X
{
public:
~X() { std::cout << "X::destructor" << std::endl;
}
size_t advance()
{
X x;
return value++;
}
Xのデストラクタにブレークを入れ、その時点で値がすでにインクリメントされているかどうかを確認します。/ FA(Visual Studio)を使用してコンパイルし、コンパイラーによって生成されたアセンブリを確認することもできます。
はい-それらは同等です。ロックは増分後に破棄されます。そうしないと、後者の場合でも同じ問題が発生します。