Возможно ли (с любой модификацией класса А) выполнить следующую работу? т. е. сделать самый неприятный анализ ошибкой?
class A {
};
int main() {
A a(); // can this be forced to be an error??
A b; // this should work
}
Нет модификации класса 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());
В текущей спецификации языка нет способа сделать этот код ошибочным. Обычно, вы просто получаете забавное сообщение об ошибке, когда пытаетесь использовать «объект». Однако некоторые компиляторы предупреждают о ситуации (например, 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??
^~