いくつかのメンバー関数で3つのdoubleを保持するための構造体があるとします。
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
これは簡単にするために少し工夫されていますが、同様のコードがそこにあることに同意するはずです。これらのメソッドを使用すると、便利なチェーンを作成できます。次に例を示します。
Vector v = ...;
v.normalize().negate();
あるいは:
Vector v = Vector{1., 2., 3.}.normalize().negate();
begin()関数とend()関数を提供した場合、ベクターを新しいスタイルのforループで使用して、3つの座標x、y、zをループすることができます(間違いなく、より「便利な」例を作成できます。 Vectorを文字列などで置き換える):
Vector v = ...;
for (double x : v) { ... }
私たちも行うことができます:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
そしてまた:
for (double x : Vector{1., 2., 3.}) { ... }
ただし、次のように(私には思えます)壊れています。
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
前の2つの使用法の論理的な組み合わせのように見えますが、前の2つは完全に問題なく、この最後の使用法はぶら下がり参照を作成すると思います。
- これは正しく、広く評価されていますか?
- 上記のどの部分が「悪い」部分であり、避けるべきですか?
- for式で構築された一時がループの期間中存在するように、範囲ベースのforループの定義を変更することにより、言語は改善されますか?