Code duplication is not good:

```
                const T &operator[](array<long, N> const& indices) const
                {
                    size_t offset = indices[N-1];
                    long mult = shape[N-1];
                    for(size_t i = N - 2; i > 0; --i) {
                        offset +=  indices[i] * mult;
                        mult *= shape[i];
                    }
                    return buffer[offset + indices[0] * mult];
                }
                T& operator[](array<long, N> const& indices)
                {
                    // Forward to const
                    return const_cast<T &>( static_cast<const ndarray<T, N> &>( *this )[indices] );
                }
```

"Nobody ever got fired for following Scott Meyers"