【C++】/人◕ ‿‿ ◕人\ < わけがわからないよ

プログラミングしてたらちょっと頭を抱えたくなる意味不明な事態に遭遇.
能力不足ゆえの事態ではありますが考えても意味がわからなかったので書いておきます.

「値が変更されていた場合にtrueを返す関数」を返却する関数を作成しようと思い,まずはこんな感じのコードを書いてみました.

#include <functional>

template<typename Type>
std::function<bool()> isChanged(Type &Value){
	Type* Ptr = new Type(Value);
	return [&](){
		// Check
		bool Result = !(Value == *Ptr);
		// Copy
		*Ptr = Value;
		// End
		return Result;
	};
}

要はValueのコピーを作成し,値を比較してその結果を返却する関数です.何度もtrueが返却される事態を防ぐために,一度検知したらコピーの値を上書きしています.で,こんな感じで使おうと思っていました.

int main()
{
	int count = 0;
	bool EndFlag = false;
	std::function<bool()> Bf = isChanged<bool>(EndFlag);
	// EndFlagが変更されていた場合trueが返されループを抜ける
	while(Bf() == false){
		count++;
		std::cout << count << std::endl;
		if(count >= 100){ EndFlag = true; }
	}
	return 0;
}

さて,実行しよう.

test.exeは動作を停止しました
問題の解決策をオンラインで確認できます。

▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああああああ

え,だってこれじゃダメでしょ…?

#include <functional>

template<typename Type>
std::function<bool()> isChanged(Type &Value){
	Type& Ptr = Type(Value);
	return [&](){
		// Check
		bool Result = !(Value == Ptr);
		// Copy
		Ptr = Value;
		// End
		return Result;
	}
}

test.exeは動作を停止しました

だよねえ….ならこうすればいいの…?

#include <functional>

template<typename Type>
std::function<bool()> isChanged(Type &Value){
	Type* Ptr = new Type(Value);
	auto Inv = *Ptr;
	return [&](){
		// Check
		bool Result = !(Value == Inv);
		// Copy
		Inv = Value;
		// End
		return Result;
	}
}

test.exeは動作を(ry

これでもやっぱりダメそう.「この方法じゃダメなのか」と思いながらこれも試してみる.

#include <functional>

template<typename Type>
std::function<bool()> isChanged(Type &Value){
	Type* Ptr = new Type(Value);
	Type& Inv = *Ptr;
	return [&](){
		// Check
		bool Result = !(Value == Inv);
		// Copy
		Inv = Value;
		// End
		return Result;
	}
}

成功した.
どうなってるんですかこれ.最初の方法がダメでこっちなら大丈夫な理由がいまいちわからないでござるよ.