获得一个过去的指针

时间:2010-12-20 21:56:51

标签: c++

  

可能重复:
  Take the address of a one-past-the-end array element via subscript: legal by the C++ Standard or not?

const int n = ...;
T a[n];
T* begin = &a[0]; //or just a
T* end = begin + n;

我知道这很合法。但是我想知道以下是不确定的行为还是合法的。答案是否取决于类型T?

T* end = &a[n];

P.S。这个问题是一个好奇的问题,所以请不要提到矢量是数组之类的更好的替代品:)

1 个答案:

答案 0 :(得分:0)

是。这是未定义的行为。不,T的类型无关紧要。

链接副本中已接受的答案因其自己选择的标准引用而出错。不幸的是,他最终混淆了逻辑,得出了完全相反的结论。 3.9.2 / 3中的注释包含在一个非常明确地谈论类型的段落中,而不是解除引用的能力。指针的类型(数组+大小)与“as-if”相同,那里有一个类型为T的有效对象;这并不意味着那里有一个有效的对象,事实上并没有。

在C99标准的副本中有一个引用明确指出& array [index]不会导致指针解除引用,这通常由数组[index]隐含。 C99不是C ++,我没有看到任何相同的文字说同样的事情。只有通过该规则才能在C中合法。

C ++ 0x将包含一些C99,我不知道这个位是否包含在内。你不应该认为它们是同一种语言。

大多数C ++编译器都会高兴地使用它,但是你总是可以遇到一个兼容的编译器。