Ich habe eine operator[]
für meine Klasse und alles, was es tut, ist auf einem unique_ptr
Mitglied anrufen. Der relevante Teil ist gerade dies:Unter welchen Umständen könnte std :: unique_ptr :: operator [] werfen?
template <typename T> struct Foo {
T& operator [](const size_t pos) const noexcept
{
return data_[pos];
}
std::unique_ptr<T[]> data_;
};
ich den Bediener als noexcept
markiert haben. Jedoch ist unique_ptr::operator[]
nichtnoexcept
. Ich kann nicht herausfinden, warum das so ist, und ob ich nur annehmen kann, dass es nie werfen wird. unique_ptr::operator[]
selbst listet keine Ausnahmen in der Dokumentation (cppreference und MSDN behaupten, es keine Liste der Ausnahmen zu definieren, die es werfen könnte.)
Also ich nehme an, die fehlende noexcept
könnte entweder sein: a) ein Fehler, oder b) der zugrundeliegende Datentyp, auf den der Operator zugreift, wird möglicherweise ausgelöst. Option a wäre nett, denn das würde bedeuten, dass ich meinen eigenen Operator noexcept
markieren kann. Option b wäre schwer zu verstehen, da der Operator eine Referenz erhält und nichts anruft.
Also, lange Geschichte kurz, gibt es eine Möglichkeit von unique_ptr::operator[]
jemals werfen, und ist es sicher, es von einer noexcept
Funktion zu nennen?
Nun 'unique_ptr :: operato []' wendet nur 'operator []' auf den zugrunde liegenden Zeiger an, richtig? Das kann leicht zu undefiniertem Verhalten führen, wenn der Index zu groß ist, also wer weiß, was passieren könnte ... – DeiDei
@DeiDei Das wäre UB, aber nicht werfen. – vsoftco
@DeiDei 'unique_ptr' führt keine Bereichsüberprüfung durch (und es fehlt ein' at() '-Member). Wenn der Zugriff außerhalb des Bereichs liegt, wird er nicht ausgelöst. In der Tat, ich denke nicht, dass es sogar die aktuelle Größe im Auge behält, also könnte es nicht prüfen und werfen, selbst wenn es gewünscht wird. –