
"Philippe Mori" <philippe_mori@hotmail.com> wrote:
My opinion is that we should only have one swap function per object type named swap. And we should always make it such that it won't throws.
What if class only has Swap function? What to do then? Or swap can throw? (boost::array for example)
I think that the best thing would be that std::swap would only compile for a given type T if the resulting function cannot throws (because copy constructor and assigment would not throws) and thus having a type trait would not be as much usefull.
It's not possible since std::swap implementated for not specialized type as follows: T t(a); a = b; b = t; So, we can be sure in anything. Will it throw or not? Is it optimal? We just can't answer these questions.
OTOH, if we add type trait to indicate if swap is possible or if it will throw, then the defaut implementation should be able to deduce it from the traits of the copy constructor and assignment operator. In particular swap of POD types does not throws.
Yeah, some assumptions can be made, but not only for POD types and some other trivial cases. So we need to explicitly register type.
Also the compiler should be able to detect throw () specification and provide the type trait itself.
Too many people don't use throw specifications, but their swap still not throws. Thanks for comments, Philippe. -- Pavel Chikulaev