Paul Preney によって作成されたExpression templates および C++11の式テンプレート コードに何らかの形で触発されて、以下をテストすることにしました。
template<typename T>
struct X
{
X(T t) : t(std::forward<T>(t)) {}
T t;
};
template<typename T>
auto CreateX(T&& t) -> X<decltype(std::forward<T>(t))>
{
return X<decltype(std::forward<T>(t))>(std::forward<T>(t));
}
次に、それを使用して、次のようにX<const vector<int>&>
andのインスタンスを生成しました。X<vector<int>&&>
int main()
{
int vec = {1,2,3,4};
auto x1 = CreateX(vec);
auto x2 = CreateX(vector<int>{5,6,7,8});
cout << "x1: "; for(auto x : x1.t) cout << x << " "; cout << endl;
cout << "x2: "; for(auto x : x2.t) cout << x << " "; cout << endl;
}
出力は次のとおりです。
x1: 1 2 3 4
x2: 0 0 33 0 0 0 7 8
これは、一時的な有効期間vector<int>{5,6,7,8}
が延長されておらず、右辺値参照メンバーが別のX::t
ものにバインドされていることを示しています。
さて、この回答から右辺値への参照をconstするクラスデータメンバーの寿命は何ですか? 、これが予想される動作であることはわかっています。
ただし、ここでの質問は、右辺値参照メンバーが存在する限り一時ベクトルの存在を許可するExpression テンプレートと C++11の Paul Preney のコードの違いは何ですか? 一時的に作成されるケース 2 を参照してください。
どうやら、同じ構造がここで使用されているようですが、おそらく何かが欠けています。
編集: 以下の R. Martinho Fernandes の回答に基づいて、次のことを試しました。
int main()
{
using namespace std;
auto expr = math_vector<3>{1.0, 1.1, 1.2} + math_vector<3>{2.0, 2.1, 2.2};
cout << "vec1: "; for(int i = 0; i < 3; ++i) cout << expr.le()[i] << " "; cout << endl;
cout << "vec2: "; for(int i = 0; i < 3; ++i) cout << expr.re()[i] << " "; cout << endl;
}
そして、これが有効なコードであることがわかります。
vec1: 1.0 1.1 1.2
vec2: 2.0 2.1 2.2
したがって、式テンプレートに格納されている参照は明らかにダングリングではありません。ここで何が起こっているのですか?