Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么编译器抱怨这不是一个constexpr? 我试图在实践中了解更多关于如何使用C++常量表达式,并为说明目的创建了以下矩阵类模板: #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_{}; };_C++_C++11_Visual C++_Constexpr - Fatal编程技术网

为什么编译器抱怨这不是一个constexpr? 我试图在实践中了解更多关于如何使用C++常量表达式,并为说明目的创建了以下矩阵类模板: #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_{}; };

为什么编译器抱怨这不是一个constexpr? 我试图在实践中了解更多关于如何使用C++常量表达式,并为说明目的创建了以下矩阵类模板: #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_{}; };,c++,c++11,visual-c++,constexpr,C++,C++11,Visual C++,Constexpr,请注意,确定我做错了什么…任何帮助,使这项工作将不胜感激 声明: 如果类型是: 可能cv合格无效;或 标量类型;或 参考类型;或 文字类型的数组;或 具有以下所有属性的可能cv限定类类型(子句): 它有一个小的析构函数 它要么是闭包类型(),要么是聚合类型(),要么至少有一个不是复制或移动构造函数的constexpr构造函数或构造函数模板(可能是从基类继承的() 如果它是联合,则至少有一个非静态数据成员是非易失性文本类型,并且 如果不是联合,则其所有非静态数据成员和基类都是非易失性文本类型

请注意,确定我做错了什么…任何帮助,使这项工作将不胜感激

声明:

如果类型是:

  • 可能cv合格
    无效
    ;或

  • 标量类型;或

  • 参考类型;或

  • 文字类型的数组;或

  • 具有以下所有属性的可能cv限定类类型(子句):

    • 它有一个小的析构函数

    • 它要么是闭包类型(),要么是聚合类型(),要么至少有一个不是复制或移动构造函数的constexpr构造函数或构造函数模板(可能是从基类继承的()

    • 如果它是联合,则至少有一个非静态数据成员是非易失性文本类型,并且

    • 如果不是联合,则其所有非静态数据成员和基类都是非易失性文本类型

其中说:

如果析构函数不是用户提供的,并且:

(5.4)-析构函数不是虚拟的

(5.5)-其类的所有直接基类都有平凡的析构函数,并且

(5.6)-对于其类中属于类类型(或其数组)的所有非静态数据成员,每个 类有一个平凡的析构函数

否则,析构函数是非常重要的

换句话说,要声明
Matrix
constexpr
实例,它必须是一个文本类型,而要成为一个文本类型,它的析构函数必须是
default
ed,或者全部删除,因此:

~Matrix() = default;
或:


也许
std::array
没有constexpr copy构造函数?删除析构函数的定义作为旁注,不需要将
numrows\uu
numcols\u
存储为成员变量。既然您已经有了作为模板参数的值,只需返回这些值即可。@Piotr Skotnicki是的,成功了。谢谢如果你将此作为答复,我将接受。但是我不明白为什么定义析构函数会触发错误?@nasser sh正如我所建议的那样,我通过删除行和列sizeThanks中不必要的成员变量来清理代码,为所有的澄清做了很多工作!我喜欢或。:-)
error: C2127: 'm': illegal initialization of 'constexpr' entity with a non-constant expression
~Matrix() = default;