Microsoft a C++11

3. 6. 2012 23:24 (aktualizováno) zboj

Microsoft a standardy, to je věčné (a nevděčné) téma. Když Microsoft zprznil C++ svým C++/CX (uznávám, že ARC od Applu v zásadě jinak v prostředí C++ okopírovat nešlo), mohl si aspoň dát pozor na chyby. Teď prosím zvolejte třikrát „sláva Microsoftu!“, neboť devět měsíců po nahlášení kritického bugu jsme se konečně dočkali opravy i ve veřejné verzi překladače (jedná se o úniky paměti v lambda výrazech, psal jsem zde o nich nedávno). Přetrvává ovšem možnost přiřadit do „auto&“ dočasný objekt (podle normy to jde jen pro „const auto&“). Reakce Microsoftu byla příznačná: „It's not a bug, it's a feature.“ Tato fráze, často používaná jako vtip, byla myšlena vážně. Ne že by se Microsoftu nechtělo bug opravit, ale takto si poměrně bezpečně zajistí, že i když obejdete nového bastarda (C++/CX), tak v GCC nebo clangu budete mít s překladem problémy.

Podnětem k napsání tohoto článku je zkušenost s Visual Studio 2012 (konečně si všimli, že už není rok 2011), konkrétně kompilací C++ pro CLR. Microsoft kudí chodí, tudy se chlubí podporou C++11 a nové STL. Schválně si zkuste použít byť jen #include <thread> někde v kódu. Překladač vám hned vynadá, že <thread> můžete použít jen při /clr:safe. Toto je bez přehánění jedno z nejdebilnějších rozhodnutí Microsoftu při tvorbě kompilátorů (a příslušných knihoven). Pokud už z nějakého podivného důvodu používám /clr:safe, tak pro vlákna použiju BCL. Naopak <thread> se bude vyskytovat výhradně v kódu, kvůli kterému chci použít /clr nebo /clr:pure.

Asi nastal čas zprovoznit pod Windows clang/LLVM (nebo psát výhradně pro Metro).

P.S. MS také porušuje standard při vracení objektů v lokálních proměnných. Pokud existuje move konstruktor, má se v takovém případě použít. MS kopíruje. To aplikacím rozhodně na rychlosti nepřidá.

Sdílet