Когда я использую нотацию конструктора (declare-), определяющую указатель на указатель (вместо нотации назначения - конечно, что будет делать то же самое во время выполнения, это просто соглашение), я получаю ошибку компилятора. Мне было интересно, почему это так.
struct Foo
{ /* ... */ };
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo(&parFoo); // invalid: C2059
Foo** ppFoo = &parFoo; // OK
delete[] parFoo;
}
Ошибка - это недействительный токен C2059, который не говорит много. Однако &
не является проблемой (это означает, что это, вероятно, не ошибка приоритета оператора). Если я сделаю следующее:
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo = &parFoo; // OK
Foo** ppFoo2(ppFoo); // invalid: C2061
delete[] parFoo;
}
... тогда я получаю C2061, что означает, что на этот раз это идентификатор ppFoo
, который находится в неправильном месте.
Какое синтаксическое правило вызывает это, т.е. почему нельзя использовать обозначение вызова конструктора для определения указателей на указатели, только "меньше указаний на типы"?