c99/c++03
是否保证&a+1 > &a
始终为真?
std::copy
和
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
这总是有效吗?
答案 0 :(得分:17)
是的,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
,任何指针类型的特化都会产生总顺序,即使内置运算符&lt; ,&gt;,&lt; =,&gt; =不要。
另请注意,虽然您可以形成这些地址,并且可以将它们与对象的地址进行比较,但无法取消引用这些指针(好吧,如果您尝试,编译器可能不会阻止您,但结果将是未定义的行为)。
答案 1 :(得分:3)
是的,这在C ++中是有保证的(不知道C)。具体是T类型的变量等同于同一类型的单个元素的数组,并且总是可以获得超出数组末尾的指针。