是否c99/c++03
保证&a+1 > &a
始终正确?
例如,有一个 (c-like) std::copy
,并且
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
这总是有效吗?
是的,C99 有特殊的措辞说,在处理地址时,任何给定的对象a
都将像一个包含 1 项的数组一样,所以这&a+1
是有效的(第 6.5.6/7 节):
出于这些运算符的目的,指向不是数组元素的对象的指针与指向长度为 1 且对象类型作为其元素类型的数组的第一个元素的指针的行为相同。
尽管章节编号不同(第 6.3.6 节),但 C90 给出了相同的要求。
C++ 在 §5.7/4 中具有相同的要求(C++03 和 C++11 中的节号相同)。
在 C++ 中,您可以使用 比较任意对象(相同类型)的地址std::less
,即使内置<
运算符不会产生有意义的结果(例如,不是同一数组的一部分的两个对象)(§20.8.5/7 ):
对于模板、、、
greater
和,less
任何指针类型的特化都会产生一个总顺序,即使内置运算符 <、>、<=、>= 没有。greater_equal
less_equal
另请注意,虽然您可以形成这些地址,并且可以将它们与对象的地址进行比较,但您不能取消引用这些指针(好吧,如果您尝试编译器可能不会阻止您,但结果将是未定义的行为)。
是的,这在 C++ 中得到保证(不了解 C)。具体来说,T 类型的变量等价于同一类型的单个元素的数组,并且始终可以获得超出数组末尾的指针。