&*E is equivalent to E (even if E is a null pointer)This seems to imply that sizeof(&*E) == sizeof(E), which is unexpected if E is an array. For example, on most C compilers, we have sizeof("foo") == strlen("foo")+1, while sizeof(&*"foo") == sizeof(char*). So clearly they are not equivalent.
If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.However the footnote says that &*E is equivalent to E, so if E is an invalid pointer value, *E would be undefined behavior, but &*E is not? (I'm aware that compilers may treat them equivalent, but this is precisely because *E has undefined behavior even if the immediate child of an & operator.) The sentence quoted above is not part of the constraints, so &* does still remove UB even though "the constraints on the operators still apply"?
in the paragraph on address and indirection operators (6.5.3.2 in the
C23 draft N3047), there is a footnote (footnote 117 in that draft),
which says that
&*E is equivalent to E (even if E is a null pointer)
This seems to imply that sizeof(&*E) == sizeof(E), which is unexpected
if E is an array.
Further, we have that
If an invalid value has been assigned to the pointer, the behavior of
the unary * operator is undefined.
However the footnote says that &*E is equivalent to E, so if E is an
invalid pointer value, *E would be undefined behavior, but &*E is not?
... &* does still remove UB even though "the constraints on the
operators still apply"?
How is one to read this footnote, and the paragraph in general? Why
does it try to say that things are "equivalent" that sometimes are
not?
JoJoModding <jojohostert@gmail.com> writes:
in the paragraph on address and indirection operators (6.5.3.2 in the
C23 draft N3047), there is a footnote (footnote 117 in that draft),
which says that
&*E is equivalent to E (even if E is a null pointer)
This seems to be a case where a footnote might add confusion rather than clarity. The normative text makes it clear that &*E can't be equivalent
to E in every way because &*E is not an lvalue. And &*E has type
constraints that E does not have.
This seems to imply that sizeof(&*E) == sizeof(E), which is unexpected
if E is an array.
There are much simpler examples if the apparent non-equivalence. If p
is a pointer object, p can be assigned to by &*p can't be. And due to
the clause about constraints. &*(void *)0 is a constraint violation,
but (void *)0 is obviously fine.
Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
JoJoModding <jojohostert@gmail.com> writes:
in the paragraph on address and indirection operators (6.5.3.2 in the
C23 draft N3047), there is a footnote (footnote 117 in that draft),
which says that
&*E is equivalent to E (even if E is a null pointer)
This seems to be a case where a footnote might add confusion rather than
clarity. The normative text makes it clear that &*E can't be equivalent
to E in every way because &*E is not an lvalue. And &*E has type
constraints that E does not have.
This seems to imply that sizeof(&*E) == sizeof(E), which is unexpected
if E is an array.
There are much simpler examples if the apparent non-equivalence. If p
is a pointer object, p can be assigned to by &*p can't be. And due to
the clause about constraints. &*(void *)0 is a constraint violation,
but (void *)0 is obviously fine.
What makes you say &*(void*)0 is a constraint violation? I
don't see any constraints that are violated.
Sysop: | DaiTengu |
---|---|
Location: | Appleton, WI |
Users: | 1,030 |
Nodes: | 10 (0 / 10) |
Uptime: | 75:13:26 |
Calls: | 13,351 |
Calls today: | 3 |
Files: | 186,574 |
D/L today: |
7,680 files (1,923M bytes) |
Messages: | 3,358,920 |