Я пытаюсь узнать немного больше о том, как использовать постоянные выражения C++ на практике и создал следующий шаблон класса Matrix для целей иллюстрации:Почему компилятор жалуется, что это не является constexpr?
#include <array>
template <typename T, int numrows, int numcols>
class Matrix{
public:
using value_type = T;
constexpr Matrix() : {}
~Matrix(){}
constexpr Matrix(const std::array<T, numrows*numcols>& a) :
values_(a){}
constexpr Matrix(const Matrix& other) :
values_(other.values_){
}
constexpr const T& operator()(int row, int col) const {
return values_[row*numcols+col];
}
T& operator()(int row, int col){
return values_[row*numcols+col];
}
constexpr int rows() const {
return numrows;
}
constexpr int columns() const {
return numcols;
}
private:
std::array<T, numrows*numcols> values_{};
};
Идея заключается в том, чтобы иметь простой класс Matrix, который я могу использовать для малых матриц для оценки выражений Matrix во время компиляции (обратите внимание, что я еще не реализовал обычные матричные операторы для сложения и умножения).
При попытке инициализировать экземпляр матрицы следующим образом:
constexpr std::array<double, 4> a = {1,1,1,1};
constexpr Matrix<double, 2, 2> m(a);
Я получаю следующее сообщение об ошибке от компилятора (MS Visual C++ 14):
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
Примечание уверен, что я делать не так ... любая помощь, чтобы сделать эту работу будет очень признательна!
Может быть 'станд :: array' не имеет constexpr конструктор копирования? –
Удалить определение деструктора –
В качестве побочного элемента нет необходимости хранить 'numrows_' и' numcols_' в качестве переменных-членов. Поскольку у вас уже есть значения в качестве параметров шаблона, просто верните их. –