const参照を処理する次のコードについて考えてみます。
const int & func (const int &x)
{
return x;
}
struct Foo {
Foo (const int &x)
: m_x(x) {}
const int & getX ()
{ return m_x; }
const int &m_x;
};
次のうち、現在許可されているものがある場合は、それを知りたいのですが。
int x = func(int(7));
int y = Foo(int(7)).getX();
割り当てまたは?int
によって使用される前に一時オブジェクトがまだ存在するという保証はありますか?getX
更新:これは安全なようですが、なぜ正確なのですか?
- 一時的なものはconst参照に再帰的にバインドされ、それらへのバインドされた参照が存在する限り存在することが保証されているためですか?
- それとも、完全な表現の期間中、それらが存在することが保証されているからですか?
参照の代わりにポインタを格納するエッジケースを考えてみましょう。
struct Foo {
Foo (const int &x)
: m_x(&x) {}
const int & getX ()
{ return *m_x; }
const int *m_x;
};
int y = Foo(int(7)).getX();
ケース1)が正しければ、これは機能しないようです。しかし、ケース2)が正しければ、そうなるでしょう。