Моя попытка инициализации значения интерпретируется как объявление функции, и почему не 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()));
обойти конкретное исключение, записанное в стандарте?