R値の出力がL値と異なる理由を誰かに説明してもらえますか?
#include <iostream>
#include <vector>
using namespace std;
template<typename Ct>
struct ct_wrapper {
Ct&& ct; // R or L ref
explicit ct_wrapper(Ct&& ct)
: ct(std::forward<Ct>(ct)) { std::cout << this->ct[1];};
};
int main() {
// L-val
vector<int> v{1,2,3};
ct_wrapper<vector<int>&> lv(v);
cout << endl << lv.ct[0] << lv.ct[1] << lv.ct[2] << endl;
// R-val
ct_wrapper<vector<int>&&> rv(vector<int>{1,2,3});
cout << endl << rv.ct[0] << rv.ct[1] << rv.ct[2] << endl;
}
出力 (gcc48 と clang32 で同じ):
2
123
2
003
答え
Johannes Schaub とのチャットで少し埋もれてしまったので、ここに記載します。
一時的なベクトルが r-value-ref member-variable を初期化する場合rv.ct
、特別な例外があるため、一時的な有効期間は延長されません: [class.temporary]p5: "コンストラクターの ctor-initializer (12.6.2) で参照メンバーに一時的にバインドされています。コンストラクターが終了するまで持続します。」