いくつかのメンバー関数で 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() 関数を提供した場合、Vector を新しいスタイルの for ループで使用できます。たとえば、x、y、z の 3 つの座標をループすることができます (間違いなく、より多くの「有用な」例を作成できます)。 Vector を String などに置き換えることによって):
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 ループの定義を変更することで、言語は改善されますか?