Есть ли способ форсировать «самый неприятный синтаксический анализ»? быть ошибкой, даже на основе класса?

Возможно ли (с любой модификацией класса А) выполнить следующую работу? т. е. сделать самый неприятный анализ ошибкой?

class A {
};

int main() {
A a(); // can this be forced to be an error??
A b;   // this should work
}

4

Решение

Нет модификации класса A будет иметь какое-либо влияние на то, как объявление A a(); анализируется Синтаксический анализатор определяет, что это объявление функции, прежде чем он потрудится взглянуть на определение A, На самом деле определение A даже не нужно быть видимым, чтобы разобрать это утверждение; Предварительной декларации достаточно.

Однако компиляторы обычно имеют предупреждение об этом, и вы, вероятно, можете превратить это в ошибку. Например, с Clang вы можете использовать флаг -Werror = раздражающий-синтаксический анализ.

struct A;

A a(); // no error

int main() {
A a(); // error
}

clang ++ -std = c ++ 11 -Weverything -Werror = vexing-parse main.cpp

main.cpp:6:8: error: empty parentheses interpreted as a function declaration [-Werror,-Wvexing-parse]
A a();
^~
main.cpp:6:8: note: replace parentheses with an initializer to declare a variable
A a();
^~
{}
1 error generated.

Хотя технически говоря A a(); не синтаксис, известный как самый неприятный анализ. Это было бы:

A a(B());
5

Другие решения

В текущей спецификации языка нет способа сделать этот код ошибочным. Обычно, вы просто получаете забавное сообщение об ошибке, когда пытаетесь использовать «объект». Однако некоторые компиляторы предупреждают о ситуации (например, clang):

clang++ -W -Wall  -Werror -c -o vexing.o vexing.cpp
vexing.cpp:5:8: error: empty parentheses interpreted as a function declaration [-Werror,-Wvexing-parse]
A a(); // can this be forced to be an error??
^~
1

По вопросам рекламы [email protected]