给定一个用户定义类型 A
,以及一个指针 A* a
,*a
和 a[0]
有什么区别?
(虽然 *(a+0)
/a[0]
被定义为等价的,但对于 *a
/a[0]
来说情况并非如此,在某些情况下微妙的差异可能导致编译错误。)
给定一个用户定义类型 A
,以及一个指针 A* a
,*a
和 a[0]
有什么区别?
(虽然 *(a+0)
/a[0]
被定义为等价的,但对于 *a
/a[0]
来说情况并非如此,在某些情况下微妙的差异可能导致编译错误。)
如果A
是不完整的类型,则*a
可用,但a[0]
不能使用,在这个例子中:
struct A;
void foo(A& r)
{
}
void bar(A* a)
{
foo(*a);
foo(a[0]); // error: invalid use of incomplete type ‘struct A’
}
那是因为a[0]
等同于*(a+0)
,但你不能对一个不完整类型的对象的指针加上任何值(包括零),因为指针算术需要已知大小。
sizeof(e)
需要求出 e
的类型必须是一个完整的类型,否则这种操作就没有意义。 - Yakov Galka
template<typename T, int N> T *begin(T(&x)[N]) { return &x[0]; }
的begin函数,并没有注意到使用数组语法时对T产生了微妙的无用要求。 - Johannes Schaub - litb*a
视为表达式,还是只是一段文本?例如b * a
与b a[0]
? - Andy Prowl++
的例子就可以让你到达那里。 - Lightness Races in Orbit