A most vexing parse (kb. „legbosszantóbb elemzés”) a C++ programozási nyelvben a szintaktikai kétértelműség feloldásának egy ellentmondásos formája. Bizonyos helyzetekben a fordítóprogram nem tud különbséget tenni egy objektum példányának létrehozása és egy függvény deklarálása között, és ebben a helyzetben függvénydeklarációként értelmezi az inkriminált sort. Ez zavarba ejtő és frusztráló lehet a programozó számára, mivel a kód látszólag adott dolgot kellene csináljon, de a C++ nyelvtani szabályai miatt másképp viselkedik. Elkerülése érdekében óvatosnak kell lenni a zárójelek használatánál konstruktorok meghívásában, és meg kell győződni arról, hogy a programozó szándéka egyértelmű a fordítóprogram számára.

Példa A leggyakoribb forgatókönyv, ahol a most vexing parse előfordul, az üres zárójelpár használata a deklarációnál. Legyen egy ilyen struktúránk:

struct Macska { Macska(bool aranyos = true) { /* kód */ } ...

Tekintsük a következő eseteket: Macska cirmos; // Ez helyesen létrehoz egy Macska típusú példányt, az alapértelmezett konstruktort használva az alapértelmezett argumentummal

Macska cirmos(); // Ez a "most vexing parse". A programozó számára úgy tűnik, mintha egy példányt hozna létre alapértelmezett argumentummal, // de a fordító valójában egy cirmos nevű függvény prototípusát deklarálja, amely egy Macska objektumot ad vissza

Macska cirmos(true); // Ez helyesen létrehoz egy Macska típusú példányt, az alapértelmezett konstruktort használva explicit argumentummal

Macska cirmos{}; // Úgynevezett "uniform initialization", a legelső példával ekvivalens, C++11 óta ez a javasolt

Források https://www.fluentcpp.com/2018/01/30/most-vexing-parse/ https://en.cppreference.com/w/cpp/language/direct_initialization

Kategória:C++