- Przy templatkach to co produkuje kompilator mówi głównie, że jest jakiś błąd. Tego nie da się czytać.
To po pierwsze wina kompilatora a nie samego języka (no może języka w tym sensie, że jego złożoność powoduje że jest BARDZO trudno zgadnąć o co programiście chodziło i wypluć sensowny komunikat).
A po drugie, to z wersji na wersję poszczególnych kompilatorów jest jednak coraz lepiej.
- Odziedziczone po C UB. Smutne jest to, że to prawdopodobnie zostanie z nim już do samego końca.
Wiele przypadków UB dałoby się zlikwidować bezboleśnie.
Na przykład nie widzę sensu dla którego UB miałyby być wyrażenia takie jak x = x++
czy x++ + ++x
.
Wystarczyłoby jednoznacznie określić kolejność operacji. C# przykładowo ma kilka łatwych do zapamiętania reguł.
W C++ problematyczne jest nawet coś takiego: cout << foo() << bar()
. Okazuje się, że (przed C++17) nie ma gwarancji, że funkcje foo() i bar() wykonają się w tej kolejności, co może się zemścić jeśli funkcje mają skutki uboczne. Dopiero C++17 nakazuje że foo ma się wykonać przed bar.
Co innego jednak próba odczytania czy zapisu pamięci przy użyciu nieprawidłowego wskaźnika. To musi pozostać UB (i jest to UB nawet w C#, tyle że w nim wskaźników używa się bardzo rzadko).
- Brak modułów. Serio, 2 lub więcej plików per 1 klasa (.hpp i .cpp)? serio?
Moduły już miały być dawno, ale chyba nie mogą dojść do porozumienia. I chyba celem modułów nie jest zlikwidowanie podziału na .h i .cpp.
Zresztą sensowne IDE powinno mieć przełączanie między implementacją a nagłówkiem pod jednym klawiszem funkcyjnym.