Описание тега most-vexing-parse

Термин "наиболее неприятный синтаксический анализ" (введен Скоттом Мейерсом в "Эффективный STL") относится к особой синтаксической двусмысленности в программах на C++, которая приводит к противоречивой интерпретации некоторых объявлений. Это часто сопровождается плохой диагностикой, что сбивает с толку многих программистов, которые с ней сталкиваются.

Наиболее раздражающий синтаксический анализ относится к конкретному C++ синтаксической неоднозначностью, где декларация утверждение, что можно интерпретировать либо как описания объекта с инициализатором, который представляет собой временный объект или как объявление функции не будет решено, по правилу, в объявление функции.

Например, строка

MyObject obj(4);

объявляет объект типа MyObject названный objпередавая 4 в качестве параметра. Однако линия

MyObject obj(OtherType());

вовсе не объявлятьobj как объект, созданный из инициализированного значения OtherType временный, но вместо этого объявляет функцию с именем obj который принимает указатель на функцию без аргументов и возвращает OtherType. (Параметры функции, объявленные как имеющие тип функции, автоматически настраиваются на соответствующий указатель на тип функции таким же образом, как параметры функции, объявленные с типами массива, настраиваются на соответствующий тип указателя.)

Чтобы преобразовать объявление в тип объекта, можно использовать следующие альтернативы.

MyObject obj1( (OtherType()) ); // extra parentheses

MyObject obj1 = OtherType(); // Requires an implicit conversion between types
                             // and requires MyObject to be copyable (or movable
                             // in C++11

MyObject obj1 {OtherType()}; // C++11 syntax