Описание тега most-vexing-parse
Наиболее раздражающий синтаксический анализ относится к конкретному 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