C ++ noexcept für eine Funktion, die keine Ausnahmen auslöst, aber einen Speicherfehler verursachen kann
Zum Beispiel ist es üblich, auf zwei verschiedene Arten auf Elemente eines privaten Arrays zuzugreifen, den Array-Subskriptionsoperator zu überladen oder @ zu definiereat
:
T& operator[](size_t i) { return v[i]; }
T const& operator[](size_t i) const { return v[i]; }
T& at(size_t i)
{
if (i >= length)
throw out_of_range("You shall not pass!");
return v[i];
}
T const& at(size_t i) const
{
if (i >= length)
throw out_of_range("You shall not pass!");
return v[i];
}
Dasat
version kann eine Ausnahme auslösen, der Array-Subskriptionsoperator jedoch nicht.
Meine Frage ist, obwohl dieoperator[]
löst keine Ausnahme aus, kann als @ markiert werdnoexcept
selbst wenn man weiß, dass es ein SIGSEGV-Signal auslösen kann, oder ist es nur eine schlechte Praxis?
Ich möchte darauf hinweisen, dass ein Signal (wie SIGSEGV) keine Ausnahme ist. Das @ wörtlich interpretiernoexcept
Bedeutung, einnoexcept
ie @ -Funktion gibt an, keine Ausnahmen auszulösen. Es sagt nichts über irgendetwas anderes aus (einschließlich der Signale).
Aber einnoexcept
-Funktion hat mehr Bedeutung als das, zumindest für Klienten meines Codes.noexcept
sagt implizit auch, dass die Funktion sicher ist und ihre Ausführung ohne Rechenfehler beendet.
So, ist es unangemessen, @ zu markierenoexcept
eine Funktion, die nicht sicher ist?