- Title
- Qualification conversions and pointers to arrays of pointers
- Status
- cd4
- Section
- 7.3.6 [conv.qual]
- Submitter
- Roger Orr
Created on 2002-01-02.00:00:00 last changed 55 months ago
Messages
Date: 2014-11-15.00:00:00
[Moved to DR as N4261 at the November, 2014 meeting.]
Date: 2014-10-15.00:00:00
Proposed resolution (October, 2014): The resolution is contained in paper N4261.
Date: 2022-02-18.07:47:23
Additional note, February, 2014:
Geoffrey Romer: LWG plans to resolve US 16/LWG 2118, which concerns
qualification-conversion of unique_ptr for array types, by effectively
punting the issue to core: unique_ptr<T[]> will be specified
to be convertible to unique_ptr<U[]> only if T(*)[]
is convertible to U(*)[] . LWG and LEWG have jointly decided to
adopt the same approach for shared_ptr<T[]> and
shared_ptr<T[N]> in the Fundamentals TS. This will probably
substantially raise the visibility of core issue 330, which concerns the
fact that array types support only top-level qualification conversion of
the element type, so it'd be nice if CWG could bump up the priority of that
issue. See also issue 1865.
Date: 2022-02-18.07:47:23
Suggested resolution: Artem Livshits proposed a resolution :- "I suppose if the definition of "similar" pointer types in
7.3.6 [conv.qual] paragraph 4 was
rewritten like this:
T1 is cv1,0 P0 cv1,1 P1 ... cv1,n-1 Pn-1 cv1,n T and T2 is cv1,0 P0 cv1,1 P1 ... cv1,n-1 Pn-1 cv1,n T where Pi is either a "pointer to" or a "pointer to an array of Ni"; besides
P0 may be also a "reference to" or a "reference to an array of N0" (in the
case of P0 of T2 being a reference, P0 of T1 may be nothing). In fact I guess Pi in this notation may be also a "pointer to member", so
7.3.6 [conv.qual]/{4,5,6,7} would be nicely wrapped in one
paragraph."
it would address the problem.
Date: 2022-02-18.07:47:23
Section 7.3.6 [conv.qual]
covers the case of multi-level pointers, but does not appear to cover the
case of pointers to arrays of pointers.
The effect is that arrays are treated differently from simple scalar
values. Consider for example the following code:
(from the thread "Pointer to array conversion question" begun in
comp.lang.c++.moderated)
The problem appears to be that the pointed to types in example 1 are
unrelated since nothing in the
relevant section of the standard covers it - 7.3.6 [conv.qual]
does not mention conversions of the form
"cv array of N pointer to T"
into
"cv array of N pointer to cv T" It appears that reinterpret_cast is the only way to perform the
conversion.
int main()
{
double *array2D[2][3];
double * (*array2DPtr1)[3] = array2D; // Legal
double * const (*array2DPtr2)[3] = array2DPtr1; // Legal
double const * const (*array2DPtr3)[3] = array2DPtr2; // Illegal
}
and compare this code with:-
int main()
{
double *array[2];
double * *ppd1 = array; // legal
double * const *ppd2 = ppd1; // legal
double const * const *ppd3 = ppd2; // certainly legal (4.4/4)
}
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022-02-18 07:47:23 | admin | set | messages: + msg6680 |
| 2017-02-06 00:00:00 | admin | set | status: drwp -> cd4 |
| 2015-05-25 00:00:00 | admin | set | status: dr -> drwp |
| 2015-04-13 00:00:00 | admin | set | messages: + msg5336 |
| 2014-11-24 00:00:00 | admin | set | status: review -> dr |
| 2014-10-13 00:00:00 | admin | set | messages: + msg5147 |
| 2014-10-13 00:00:00 | admin | set | status: drafting -> review |
| 2014-07-07 00:00:00 | admin | set | status: open -> drafting |
| 2014-03-03 00:00:00 | admin | set | messages: + msg4903 |
| 2002-01-02 00:00:00 | admin | create | |