Próbuję dowiedzieć się nieco więcej o tym, jak używać wyrażeń stałej C++ w praktyce i stworzył następujące klasy Matrix szablon dla celów ilustracji:Dlaczego kompilator narzeka, że nie jest to 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_{};
};
Chodzi o to, aby mieć prostą klasę Matrix, które mogę użyj dla małych macierzy do oceny wyrażeń Matrix podczas kompilacji (pamiętaj, że nie zaimplementowałem zwykłych operatorów Matrix do dodawania i mnożenia).
Kiedy próbuję zainicjować instancji Matrix następująco:
constexpr std::array<double, 4> a = {1,1,1,1};
constexpr Matrix<double, 2, 2> m(a);
otrzymuję następujący błąd z kompilatorem (MS Visual C++ 14):
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
Uwaga pewien, kim jestem robić źle ... każda pomoc, aby ta praca była bardzo ceniona!
Może 'std :: array' nie posiada constexpr kopiowania konstruktora? –
Usuń definicję destruktora –
Jako sidenote, nie ma potrzeby przechowywania "numrows_" i "numcols_" jako zmiennych członkowskich. Ponieważ już masz wartości jako parametry szablonu, po prostu je zwróć. –