当我使用过载[] [] [] []运算符时,C 中的运算符创建最小矩阵类
class matrix {
private:
vector<T> elems_;
size_t nrows_;
size_t ncols_;
public:
T const* operator[] ( size_t const r ) const { return &elems_[r * ncols_]; }
T* operator[] ( size_t const r ) { return &elems_[r * ncols_]; }
matrix ();
matrix ( size_t const nr, size_t const nc )
: elems_( nr * nc ), nrows_( nr ), ncols_( nc )
{ }
matrix ( size_t const nr, size_t const nc, T const *data)
: elems_( nr * nc ), nrows_( nr ), ncols_( nc )
{ size_t ptr=0;
for (int i=0;i<nr;i++)
for (int j=0;j<nc;j++)
elems_[ptr] = data[ptr++];
}
}
g 返回警告operation on ‘ptr’ may be undefined [-Wsequence-point]
。在上一篇文章中为什么我要"操作"可能是不确定的。在C 中的语句表达中?可以解释说the last thing in the compound statement should be an expression followed by a semicolon
,但没有其服务的目的。这是否意味着g++
总是会对最终具有前面的复合语句发出此警告?
如果是这样,谁能解释为什么这很有用?我想不出任何理由,为什么应该建议任何人不要用for
循环结束复合语句。
在elems_[ptr] = data[ptr++]
中,首先评估elems_[ptr]
还是首先评估data[ptr++]
是不确定的。就是这样,因为=
不引入序列点。
根据顺序,elems_[ptr] = data[ptr++]
产生不同的结果。因此警告。