Wpis z mikrobloga

jak to się dzieje, że to działa?

constexpr const char &at(const std::size_t &n) const {
if (n >= size)
throw std::outofrange(std::to_string(n));
return _data[n];
}

constexpr i throw, i string... #cpp
  • 4
  • Odpowiedz
@n_i_e_rozumiem: Ale co tu ma nie działać? Constexpr jest tylko podpowiedzią dla kompilatora, możliwe że skompiluje się jako zwykła funkacja. Co ciekawe przy obliczaniu wartości constexpr jest analizowana tylko jedna gałąź brancha, czyli dla n mniejszego od rozmiaru to trow wogóle nie jest brane pod uwagę.
Dzięki temu łatwo można sprawdzić czy czasem funkcja constepr nie została skompilowana wołając np nie zaimplementowaną funkcję w branczu ale koniecznie zależnym od parametru.
  • Odpowiedz
@lionbest: No ale przecież funkcja constexpr ma gwarantować możliwość wykonania na etapie kompilacji..
Ok, przetestowałem to sobie lepiej i faktycznie jeśli w constexprowym kontekście trafi na brancha ifa, który rzuca wyjątkiem, to się nie skompiluje.

Jak to zrobić ładniej? Żeby w takim wypadku nie waliło mi błędem na pół ekranu, tylko zakomunikowało użytkownikowi, że wyjechał za daleko w jakiś przystępny sposób(na etapie kompilacji)?
  • Odpowiedz