当我使用overloading [][] operators in 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]
。在上一篇文章中
Why I got "operation may be undefined" in Statement Expression in C++?解释说the last thing in the compound statement should be an expression followed by a semicolon
但不是它的目的。这是否意味着g++
将始终对最后具有for循环的复合语句抛出此警告?
如果是这样,任何人都能解释为什么这有用吗?我想不出有什么理由可以建议任何人不要用for
循环结束复合语句。
答案 0 :(得分:5)
在elems_[ptr] = data[ptr++]
中,未定义是先评估elems_[ptr]
还是先评估data[ptr++]
。之所以这样,是因为=
没有引入序列点。
根据订单的不同,elems_[ptr] = data[ptr++]
会产生不同的结果。因此警告。