2015-09-17 16 views
23

Sono nuovo l'uso della noexcept progettista e non capisco il motivo per cui std::array::front e std::array::back non sono dichiarati noexcept (mentre std::array::begin e std::array::end sono).Perché std :: array :: front e std :: array :: back non noexcept?

Qual è la ragione di ciò?

+1

Buona domanda. Dovrebbero essere condizionatamente non eccetto che la dimensione dell'array sia diversa da zero. Ma i fornitori possono rafforzare la noncuranza come QoI ... –

+0

@KerrekSB Neanche condizionatamente come 'std :: array ' potrebbe essere specializzato a non avere quei 'noexcept' contrari a' std :: array '. Sfortunatamente lo standard non lo prevede. – edmz

risposta

14

Da cppreference

V'è un caso speciale per un array di lunghezza zero (N == 0). In tal caso, array.begin() == array.end(), che è un valore univoco. L'effetto di chiamare front() o back() su un array di dimensioni pari a zero non è definito.

Quindi, dal momento che possiamo avere un array di dimensioni 0 front() e back() potrebbe causare un'eccezione

Per citare Sebastian Redl su why the standard doesn't mandate operator[], front and back be marked noexcept

La politica del standard su noexcept è quello di funzioni marchio solo che non possono o non deve fallire, ma non quelli che semplicemente sono specificati per non gettare eccezioni. In altre parole, tutte le funzioni che hanno un dominio limitato (passano gli argomenti sbagliati e si ottiene un comportamento indefinito) non sono noexcept, anche quando non sono specificate per il lancio.

+9

Ma questa è una condizione statica, quindi 'noexcept' potrebbe essere condizionale (proprio come il costruttore predefinito di' vector'). –

+0

@KerrekSB [Forse rilevante?] (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 Aggiunto alla risposta. fammi sapere se è abbastanza – NathanOliver

Problemi correlati