Wenn ich das nicht-werfende Swap-Idiom implementiere, sollte ich throw()
verwenden?Sollte ich throw() bei der Implementierung von Non-Throwing-Swaps verwenden?
namespace A
{
struct B
{
void swap(B& other) throw()
{ /* fancy stuff that doesn't throw */ }
};
void swap(B& lhs, B& rhs) throw()
{ lhs.swap(rhs); }
}
namespace std
{
template<>
void swap(A::B& lhs, A::B& rhs) throw()
{ lhs.swap(rhs); }
}
Insbesondere Ich sorge mich um die throw()
Spezifikation auf die Spezialisierung der std::swap
setzen.
Bonus Frage:
Ist die Antwort anders, wenn C++ 0x noexcept
Schlüsselwort verwendet?
Sie können diese drei Swap-Deklarationen bis auf eins vereinfachen: 'struct B {Freund void swap (B & a, B & b) {/ * ...* /}}; ', dann müssen die Benutzer einfach swap als' using std :: swap; swap (a, b); ', die Ihren Swap durch ADL einzieht (oder sie können boost :: swap verwenden, was dies bereits tut). Dies macht insbesondere die Sorge um eine Ausnahmespezifikation für std :: swap überflüssig, wenn Sie sich entscheiden, eine für Ihren Swap zu verwenden. –