読者です 読者をやめる 読者になる 読者になる

const 参照と右辺値参照と一時オブジェクトの寿命、あとforward_as_tupleとか

C++

一時オブジェクトとはこれである

x+y;
Type();

要するに変数に関連付けられていないオブジェクトのことである

こいつ等の寿命は式が終わるまで、つまりセミコロンが出てくるまでである

void f(const std::string&s);
//main
//fを処理する段階ではまだ生きてる
f(std::string("KOOL SHIT"));
//ここでは生きていない

これについて普通気にすることは無い。アクセスする方法もないので

また、一時オブジェクトをconst 参照、右辺値参照に入れた場合、寿命はその参照と等しくなる

{
	Test const & x = Test();
	Test && y = Test();

	x.f();
	y.f();
}//ここまで生きている

これはコピーしたりfowardしたりしても伸びない。あくまで一次に参照した参照だけでである


そして
クラスメンバにconst参照や右辺値参照など一時オブジェクトを扱えるものを絶対に作るべきではない

と、いうのは、コンストラクタで捕捉された一時オブジェクトはコンストラクタを超えて生き残れないためである


詳しくは江添さんのこれを見て
C++11: Syntax and Feature

ここで筆者は疑問が生じた。クラスが右辺値参照を持つ場合というのが標準ライブラリに存在するためである

forward_as_tupleである

恐らくこれのギミックはfoward_as_tupleの関数で受け取った参照をtupleに渡していると考えられる

そのためここで生成されたtupleの実質的な寿命は式内だけであり

auto c=std::foward_as_tuple(1+2);
func(c);//Bad!!c is Dead!!

とかやってはいけない