Re: new an array of pointers
On Mar 19, 10:31 pm, "Johannes Schaub (litb)" <schaub-johan...@web.de>
wrote:
James Kanze wrote:
On Mar 18, 9:11 pm, "Alf P. Steinbach" <al...@start.no> wrote:
[snippet]
"ComeauTest.c", line 3: error: a value of type "int *" cannot be used to
initialize
an entity of type "int **"
int **p = new (int*)[30];
</example>
but it doesn't have the type int**: the new expression
returns an int** (pointing to a single uninitialized
int*), but dereferencing it (remember, a[b] is the same
as *(a+b)) results in an int*.
Right, but first it must pass muster syntactically.
It does. At least according to my copy of the epxression.
The new expression is "new (int*)". And that gets used as
the left operand of the [] expression. I don't know what
Comeau is complaining about with "this operator is not
allowed at this point---the grammar clearly allows it. (The
new expression, in this case, matches "::[opt] new
new-placement[opt] ( type-id ) new-initializer[opt]", with
none of the optional parts present.
First, i want to agree that new expressions are a wilderness
of special rules xD
I think the problem with "new (int*)[30]" is that "new (int*)"
is not a postfix-expression. new-expression is branching off
unary-expression, so if you want a new-expression on the left
of op[], you need parens.
Good point. I hadn't considered that side of things, but you
(and Comeau) are right: the grammar for [] is
"postfix-expression [ expression ]", and a new expression is not
a postfix-expression.
However, think that comeau is wrong at another place on
parsing new- expressions, when it accepts "new (int[n]);" and
"new (int[0, 1]);" when n is a runtime value. "type-id" won't
accept any of these. I'm interested to see what they do in
C++0x when they need to check this in SFINAE contexts.
That's an interesting point. It is obviously (I think)
desirable that "new (int[n])" work, so that I can also write
things like "new (int(*)()[n])" to allocate an array of pointers
to functions. But the grammar does seem to forbid it (although
it allows "new (int[])" or even "new (int[5][])"-- hopefully
there are semantic constraints which forbid this).
I wonder if a DR is in order.
--
James Kanze