Tôi đang cố gắng tìm hiểu thêm một chút về cách sử dụng C++ biểu thức liên tục trong thực tế và tạo ra các mẫu sau lớp Matrix cho mục đích minh hoạ:Tại sao trình biên dịch phàn nàn về điều này không phải là một 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_{};
};
Ý tưởng là để có một lớp Matrix đơn giản, mà tôi có thể sử dụng cho các ma trận nhỏ để đánh giá biểu thức ma trận tại thời gian biên dịch (lưu ý rằng tôi chưa triển khai các toán tử Matrix thông thường để bổ sung và nhân).
Khi tôi cố gắng để khởi tạo một trường hợp Matrix như sau:
constexpr std::array<double, 4> a = {1,1,1,1};
constexpr Matrix<double, 2, 2> m(a);
Tôi nhận được lỗi sau từ trình biên dịch (MS Visual C++ 14):
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
Note chắc chắn những gì tôi làm sai ... bất kỳ trợ giúp nào để thực hiện công việc này sẽ được đánh giá cao!
lẽ 'std :: array' không có một constructor sao chép constexpr? –
Xóa định nghĩa của hàm hủy –
Là một sidenote, không cần lưu trữ 'numrows_' và' numcols_' làm biến thành viên. Vì bạn đã có các giá trị như các tham số mẫu, chỉ cần trả về các giá trị đó. –