Например, такое объявление:
int (x) = 0;
Или даже это:
int (((x))) = 0;
Я наткнулся на это, потому что в моем коде оказался фрагмент, похожий на следующий:
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
Очевидно, я хотел создать объект, C
который затем делал бы что-нибудь полезное в своем деструкторе. Однако, как это бывает, компилятор рассматривает C (y);
как объявление переменной y
с типом C
и, таким образом, выводит ошибку о y
переопределении. Интересно то, что если я напишу его как C (y).f ()
или как-то в этом роде, C (static_cast<B*> (y))
он будет компилироваться, как задумано. {}
Конечно, лучший современный обходной путь - использовать при вызове конструктора.
Итак, как я понял после этого, можно объявлять такие переменные, как int (x) = 0;
или даже, int (((x))) = 0;
но я никогда не видел, чтобы кто-то действительно использовал такие объявления. Так что меня интересует - в чем цель такой возможности, потому что пока я вижу, что это только создает случай, похожий на пресловутый «самый неприятный синтаксический анализ», и не добавляет ничего полезного?