Допустим, у меня есть этот маленький класс матрицы фиксированной размерности:
template<size_t M, size_t N>
struct MatMN {
std::array<std::array<double, N>, M> rows;
double* begin() { return rows.data()->data(); } //The scary part
double* end() { return begin() + M*N; }
//const iterators, etc.
};
, и вместо использования вложенных циклов я реализую скалярное умножение (также тестирование на равенство, двоичную де / сериализацию и т. Д.) Примерно так::
template<size_t M, size_t N>
MatMN<M, N> operator*(double scalar, MatMN<M, N> mat) {
for (double& x_ : mat) { x_ *= scalar; }
return mat;
}
Можно ли рассматривать вложенные std::array
s как единый плоский массив в стиле C, используя .data()->data()
?
Могу ли я подвергнуться строгому наложению алиасов?вопрос?Или, может быть, неожиданное заполнение структуры в конце отдельных std::array
s (то есть между строками матрицы)?До сих пор он работал нормально для меня (с GCC), но я знаю, что это мало что значит для C ++.