2015-09-17 21 views
23

Ich bin neu in der Verwendung des noexcept Spezifizierer und ich verstehe nicht, warum std::array::front und std::array::back nicht noexcept erklärt (während std::array::begin und std::array::end sind).Warum sind std :: array :: front und std :: array :: back nicht noexcept?

Was ist der Grund dafür?

+1

Gute Frage. Sie müssten bedingt sein, außer dass die Array-Größe nicht Null ist. Aber Verkäufer können noexceptisness als QoI ... –

+0

@KerrekSB nicht sogar bedingt wie 'std :: array ', konnte sich spezialisieren, um jene 'noexcept' nicht zu haben 'std :: array '. Leider sieht der Standard das nicht vor. – edmz

Antwort

14

Von cppreference

Es gibt einen speziellen Fall für einen Null-Länge-Array (N == 0). In diesem Fall ist array.begin() == array.end(), die einige einzigartige Wert ist. Die Auswirkung des Aufrufs von front() oder back() auf ein Array der Größe Null ist undefiniert.

So, da wir ein 0 Größe Array kann front() und back() könnte eine Ausnahme

verursachen Sebastian Redl Zitat auf why the standard doesn't mandate operator[], front and back be marked noexcept

Die Politik der Standard auf noexcept ist nur Zeichen Funktionen, die sich nicht oder darf nicht fehlschlagen, aber nicht diejenigen, die einfach angegeben sind, keine Ausnahmen zu werfen. Mit anderen Worten, alle Funktionen, die eine begrenzte Domäne haben (die falschen Argumente übergeben und nicht definiertes Verhalten erhalten), sind nicht noexcept, auch wenn sie nicht zum Werfen angegeben sind.

+9

Aber das ist eine statische Bedingung, also könnte das 'noexcept' konditional sein (genau wie' vector's Standardkonstruktor). –

+0

@KerrekSB [Vielleicht relevant?] (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 Der Antwort hinzugefügt. lassen Sie mich wissen, ob das genug ist. – NathanOliver

Verwandte Themen