2016-01-06 14 views
6

C++ 14-Standard definiert die find() Elementfunktionen std::map wie folgt:Warum std :: map find() wird nicht als noexcept deklariert?

iterator find(const key_type& x); 
const_iterator find(const key_type& x) const; 

Warum sind diese Funktionen nicht als noexcept definiert? Was könnte im Inneren schief gehen, das würde eine Ausnahme auslösen oder ein undefiniertes Verhalten erzeugen (außer, dass kein Element gefunden wird, in welchem ​​Fall die Funktion einen end Iterator zurückgibt und kein Ausnahmetest erforderlich wäre)?

+4

verwandt: http://stackoverflow.com/questions/20517259/why-vector-access-operators-are-not-specified-as-noexcept – NathanOliver

+0

Ich glaube nicht, dass die 'Compare'-Funktion einer Karte zu haben sei noexept, also denke ich nicht, dass 'find()' noexept sein könnte, da es die Schlüssel vergleicht – 88877

+0

@ 88877 Natürlich kann "Compare" tatsächlich werfen: '23.2.4.1.1' von C++ 14 Zustände' löschen (k) wirft keine Ausnahme, es sei denn, diese Ausnahme wird vom Compare-Objekt des Containers ausgelöst (falls vorhanden). "Bitte geben Sie Ihren Kommentar als Antwort ab. – PowerGamer

Antwort

4

find() basieren auf der Compare() Methode der Karte, die eine Ausnahme auslösen könnte (stellen Sie sich den Fall eines komplexen Schlüssels vor, der falsch sein könnte). Wir können also nicht sicher sein, dass find() keine Ausnahme auslöst.

Verwandte Themen