让我们假设我们有一个结构来保持3个双精度函数和一些成员函数:
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();
现在,如果我们提供了 start ()和 end ()函数,我们可以在一个新样式的 for 循环中使用 Vector,比如在3个坐标 x,y 和 z 上循环(你无疑可以通过用例如 String 替换 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()) { ... }
虽然它似乎是前两种用法的逻辑组合,但我认为最后一种用法创建了一个悬空引用,而前两种用法完全没有问题。