const int n = ...;
T a[n];
T* begin = &a[0]; //or just a
T* end = begin + n;
我知道这很合法。但是我想知道以下是不确定的行为还是合法的。答案是否取决于类型T?
T* end = &a[n];
P.S。这个问题是一个好奇的问题,所以请不要提到矢量是数组之类的更好的替代品:)
答案 0 :(得分:0)
是。这是未定义的行为。不,T的类型无关紧要。
链接副本中已接受的答案因其自己选择的标准引用而出错。不幸的是,他最终混淆了逻辑,得出了完全相反的结论。 3.9.2 / 3中的注释包含在一个非常明确地谈论类型的段落中,而不是解除引用的能力。指针的类型(数组+大小)与“as-if”相同,那里有一个类型为T的有效对象;这并不意味着那里有一个有效的对象,事实上并没有。
在C99标准的副本中有一个引用明确指出& array [index]不会导致指针解除引用,这通常由数组[index]隐含。 C99不是C ++,我没有看到任何相同的文字说同样的事情。只有通过该规则才能在C中合法。
C ++ 0x将包含一些C99,我不知道这个位是否包含在内。你不应该认为它们是同一种语言。
大多数C ++编译器都会高兴地使用它,但是你总是可以遇到一个兼容的编译器。