一時オブジェクトを変更して引数として渡すことはできますか?
struct Foo {
Foo& ref() { return *this; }
Foo& operator--() { /*do something*/; return *this; }
// another members
};
Foo getfoo() { return Foo(); } // return Foo() for example or something else
void func_val(Foo x) {}
void func_ref(const Foo & x) {}
int main() {
func_val(--getfoo()); // #1 OK?
func_ref(getfoo()); // #2 OK?
func_ref(getfoo().ref()); // #3 OK?
// the following line is a real example
// using --vector.end() instead of --getfoo()
func_ref(--getfoo()); // #4 OK?
const Foo & xref = --getfoo(); // Does const extend the lifetime ?
func_ref(xref); // #5 OK?
func_val(xref); // #6 OK?
}
一時オブジェクトを const 参照に割り当てると、この一時オブジェクトの寿命が延びることが知られています。コードの 4 行目と 5 行目はどうでしょうか。関数 func_ref で参照 x が常に有効であるというのは本当ですか? 問題は、operator-- が何らかの参照を返し、コンパイラーがこの参照と作成した一時オブジェクトとの関係を認識しないことです。