今天我写了一些看起来像这样的东西:
void foo(std::vector&v){ v.push_back('a'); char*front=&v.front(); char*back=&v.back(); size_t n1=back-front+1; v.push_back('b');//This could reallocate the vector elements size_t n2=back-front+1;//Is this line valid or Undefined Behavior ? }
如果当我按下"b"时发生重新分配,我还可以计算出我的两个指针的差异吗?
在阅读了标准的相关段落几次之后,我仍然无法在这一点上思考.
C++ 11 5.7.6:当减去指向同一数组对象元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应与标题(18.2)中定义为std :: ptrdiff_t的类型相同.与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义.换句话说,如果表达式P和Q分别指向数组对象的第i和第j个元素,则表达式(P) - (Q)具有值i-j,条件是该值适合于std :: ptrdiff_t类型的对象.此外,如果表达式P指向数组对象的元素或者指向数组对象的最后一个元素,并且表达式Q指向同一数组对象的最后一个元素,则表达式((Q)+1) - (P)具有与((Q) - (P))+ 1和 - ((P) - ((Q)+1))相同的值,并且如果表达式P指向一个,则值为零数组对象的最后一个元素,即使表达式(Q)+1没有指向数组对象的元素.除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.
当然我知道它有效,我只是想知道它是否合法.