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, einnoexceptie @ -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?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage