“c99/c++03”是否保证“&a+1 > &a”始终为真?
例如,有一个(类C语言的)std::copy
函数,以及
int a = 0 ;
int b[9] ;
std__copy(&a , &a+1 , b) ;
这总是有效吗?
“c99/c++03”是否保证“&a+1 > &a”始终为真?
例如,有一个(类C语言的)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
,专门用于任何指针类型的特化都产生一个全序,即使内置的操作符 <, >, <=, >= 不产生。
还要注意,虽然可以形成这些地址,并将它们与对象的地址进行比较,但是您不能引用这些指针 (如果尝试的话,编译器可能不会阻止您,但结果会是未定义的行为)。
std::less
可以用于比较任意地址。标准究竟是如何保证这一点的? - chris是的,在C++中可以保证(不确定C语言)。具体来说,类型为T的变量等价于具有相同类型的单个元素的数组,并且您始终可以获得超出数组末端的指针。
&a+1
的指针解引用。 - MOHAMEDstd::copy
,在该模板内部,end
迭代器从未被解引用。你是对的,也许我应该更明确,但如果意图是将单个对象传递给一个处理范围(即迭代器对)的函数的实现,那么这是完全有效的。 - David Rodríguez - dribeas