Среди многих вещей, которые Qaru научил меня, это то, что известно как "самый неприятный синтаксический анализ", который классически демонстрируется с помощью строки, такой как
A a(B()); //declares a function
В то время как это для большинства интуитивно представляется объявлением объекта a
типа a
, взяв временный объект B
в качестве параметра конструктора, это фактически объявление функции a
, возвращающее a a
, взяв указатель на функцию, которая возвращает B
и сама не принимает никаких параметров. Аналогично, линия
A a(); //declares a function
также относится к той же категории, поскольку вместо объекта он объявляет функцию. Теперь в первом случае обычным обходным решением этой проблемы является добавление дополнительного набора скобок/скобок вокруг B()
, поскольку компилятор затем интерпретирует его как объявление объекта
A a((B())); //declares an object
Однако во втором случае выполнение этого же приводит к ошибке компиляции
A a(()); //compile error
Мой вопрос: почему? Да, я очень хорошо знаю, что правильное "обходное решение" заключается в том, чтобы изменить его на A a;
, но мне любопытно узнать, что это такое, что дополнительный ()
для компилятора в первом примере, который затем не делает " t при повторном использовании его во втором примере. Обходным путем A a((B()));
является конкретное исключение, записанное в стандарте?