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

Среди многих вещей, которым научил Stack Overflow, является то, что известно каксамый неприятный разбор "что классически демонстрируется такой строкой, как

A a(B()); //declares a function

Хотя для большинства это интуитивно представляется объявлением объектаa типаA, принимая временныйB объект как параметр конструктора, это 'на самом деле объявление функцииa возвращаяA, взяв указатель на функцию, которая возвращаетB и сам по себе не принимает никаких параметров. Точно так же линия

A a(); //declares a function

также подпадает под ту же категорию, так как вместо объекта он объявляет функцию. Теперь, в первом случае, обычным решением этой проблемы является добавление дополнительного набора скобок / круглых скобок вокругB(), так как компилятор будет интерпретировать его как объявление объекта

A a((B())); //declares an object

Однако во втором случае, то же самое приводит к ошибке компиляции.

A a(()); //compile error

У меня вопрос, почему? Да я'Я очень хорошо знаю, что правильныйобходной путь» это изменить его наA a;, но я'Мне интересно узнать, что это такое, что дополнительный() делает для компилятора в первом примере, который затем нене работает при повторном применении во втором примере. ЭтоA a((B())); обойти конкретное исключение, записанное в стандарте?

Ответы на вопрос(5)

Ваш ответ на вопрос