struct Matrix { double e = 1.; Matrix scale(double r){e*=r;return *this;} const Matrix Identity = {10.}; } void main(){ for(int i;i<5;i++){ printf("%f\n",Matrix.Identity.scale(.9).e); } printf("\n"); for(int i;i<5;i++){ printf("%f\n",Matrix.init.scale(.9).e); } } ----------------- 9.000000 8.100000 7.290000 6.561000 5.904900 0.900000 0.810000 0.729000 0.656100 0.590490
That is again a case where the compiler didn't put unchangeable content (Identitiy and init) readonly section but read-write section. On Linux "init" is in a readonly section and thus the second loop segfaults. It would be nice if the compiler enforced/checked read-write rights.
Currently both D1 and D2 (1.068 & 2.058) compilers print: 9.000000 9.000000 9.000000 9.000000 9.000000 0.900000 0.900000 0.900000 0.900000 0.900000 As .init creates a temporary this is correct.