2015-09-17 20 views
23

Jestem nowy na wykorzystaniu noexcept specyfikacją i nie rozumiem dlaczego std::array::front i std::array::back nie są zadeklarowane noexcept (podczas std::array::begin i std::array::end są).Dlaczego std :: array :: front i std :: array :: back not noexcept?

Jaki jest tego powód?

+1

Dobre pytanie. Musiałyby one warunkowo nie być wyjątkiem, jeśli rozmiar tablicy jest niezerowy. Ale dostawcy mogą wzmocnić nieobecność jako QoI ... –

+0

@KerrekSB Nawet warunkowo jako 'std :: array ' nie może być wyspecjalizowany, aby nie mieć tych "noexcept" w przeciwieństwie do 'std :: array '. Niestety standard tego nie zapewnia. – edmz

Odpowiedz

14

Od cppreference

Jest to szczególny przypadek dla macierzy zerowej długości (N == 0). W takim przypadku array.begin() == array.end(), która jest pewną unikalną wartością. Efekt wywołania front() lub back() w tablicy o rozmiarze zerowym jest niezdefiniowany.

Więc skoro możemy mieć 0 wielkości tablicę front() i back() może spowodować wyjątek

Cytując Sebastian Redl na why the standard doesn't mandate operator[], front and back be marked noexcept

polityka średnia w sprawie noexcept jest tylko do funkcji znaku towarowego, które nie mogą lub nie może zawieść, ale nie takie, które po prostu są określone, aby nie rzucać wyjątków. Innymi słowy, wszystkie funkcje, które mają ograniczoną domenę (przekazują błędne argumenty i dostajesz niezdefiniowane zachowanie), nie są noexcept, nawet jeśli nie są określone do rzucenia.

+9

Ale to jest stan statyczny, więc "noexcept" może być warunkowe (tak jak domyślny konstruktor 'vector'). –

+0

@KerrekSB [Może istotne?] (Http://webcache.googleusercontent.com/search?q=cache:hegrzM8rlE0J:gcc.gnu.org/ml/gcc-patches/2013-09/msg01397.html+&cd=1&hl = en & ct = clnk & gl = pl) –

+0

@KerrekSB Dodano do odpowiedzi. daj mi znać, jeśli to wystarczy. – NathanOliver

Powiązane problemy