Моя попытка инициализации значения интерпретируется как объявление функции, и почему не делает (()); решить его?

CatDVI может преобразовать DVI в текст и пытается сохранить форматирование.

154
задан Ben Voigt 24 September 2018 в 15:17
поделиться

3 ответа

Нет просвещенного ответа, это просто потому, что он не определен как допустимый синтаксис языком C ++ ... Так оно и есть, по определению языка.

Если у вас есть выражение внутри тогда действительно. Например:

 ((0));//compiles

Еще проще: потому что (x) является допустимым выражением C ++, а () - нет.

Чтобы узнать больше о том, как определяются языки и как работают компиляторы, вы должны узнать о теории формального языка или, более конкретно, о контекстно-свободных грамматиках (CFG) и связанных материалах, таких как конечные государственные машины. Если вас это интересует, хотя страниц в Википедии будет недостаточно, вам понадобится книга.

70
ответ дан 23 November 2019 в 22:02
поделиться

The innermost parens in your example would be an expression, and in C++ the grammar defines an expression to be an assignment-expression or another expression followed by a comma and another assignment-expression (Appendix A.4 - Grammar summary/Expressions).

The grammar further defines an assignment-expression as one of several other types of expression, none of which can be nothing (or only whitespace).

So the reason you can't have A a(()) is simply because the grammar doesn't allow it. However, I can't answer why the people who created C++ didn't allow this particular use of empty parens as some sort of special-case - I'd guess that they'd rather not put in such a special case if there was a reasonable alternative.

6
ответ дан 23 November 2019 в 22:02
поделиться

Вместо

A a(());

вы можете использовать

A a=A();
12
ответ дан 23 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: