Sto cercando di imparare un po 'di più su come utilizzare C++ espressioni costanti nella pratica e ha creato il seguente modello classe Matrix a scopo illustrativo:Perché il compilatore si lamenta di non essere un 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_{};
};
L'idea è quella di avere una semplice classe Matrix, che posso utilizzare per piccole matrici per valutare le espressioni Matrix al momento della compilazione (si noti che non ho ancora implementato i soliti operatori Matrix per l'addizione e la moltiplicazione).
Quando cerco di inizializzare un'istanza di matrice come segue:
constexpr std::array<double, 4> a = {1,1,1,1};
constexpr Matrix<double, 2, 2> m(a);
sto ottenendo il seguente errore del compilatore (MS Visual C++ 14):
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
Nota sicuro di quello che sono fare male ... qualsiasi aiuto per fare questo lavoro sarebbe molto apprezzato!
Forse 'std :: array' non ha un costruttore di copia constexpr? –
Rimuovere la definizione del distruttore –
Come sidenote, non è necessario memorizzare 'numrows_' e' numcols_' come variabili membro. Dato che hai già i valori come parametri del modello, restituiscili. –