[cfe-dev] Specializing std::swap

James Dennett james.dennett at gmail.com
Wed May 22 20:13:57 PDT 2013

[cfe-dev now on BCC.]

On Wed, May 22, 2013 at 8:03 PM, Aleksandar Fabijanic <aleskx at gmail.com>wrote:

> Thanks for prompt response.
> On Wed, May 22, 2013 at 9:47 PM, James Dennett <james.dennett at gmail.com>
> wrote:
> > I'm not sure this is topical for cfe-dev, as it's just a question about
> C++.
> I'm not sure, either and I apologize if this is out of place. If
> someone can point me to the right place (or continue private
> discussion) I'd be happy to do that. I just never had problem with
> other compilers, so I thought I'd ask here for clarification.
> > C++ doesn't have partial specialization for templates,
> I guess you meant for functions?

Sorry: for function templates.  (Of course we do have partial
specialization for class templates.)

> > so it's not possible
> > to define a std::swap for a user-define template.
> Poco::Data::Statement is not a template.
> The question is about full specialization, which is explicitly permitted:

The _answer_ is not just about full specialization though.

> > You could write an
> > overload, except that it's not permitted to add overloads to namespace
> std.
> I am aware of that. That's why it is specialized.
You misread me.  The sentence above was about class templates, e.g.,
MyContainer<T>.  You cannot specialize std::swap for MyContainer<T>,
because of the lack of function partial specialization.  You could
specialize for particular instances of MyContainer<T>, but that's not what
you want.

> > On the bright side, ADL means that it's not necessary to put those in
> > namespace std anyway, so long as people use swap properly (such that ADL
> is
> > enabled).
> I understand there is a workaround,

I would not call it a workaround.  Calling std::swap directly is the wrong
thing to do.  Adding it to an overload set along with functions (and
function templates) found via ADL is the right way to call swap.

> but if someone explicitly calls
> std::swap<Statement>, then my swap will not be called.
Right.  That's why they should not do that.  That's not swap's interface.

> I'm interested in a generic answer to the question: why is
> specializing standard templates (such as e.g. std::swap) not a good
> practice?
Because it's not a general solution (because it can't work for class
templates), and a general solution exists (put the swap in the right
namespace, and call it via ADL).

How/where would you implement a swap for MyContainer<T>?  You can't put a
function template in namespace std.

It would be ugly to have one solution for class templates and another for
non-templates.  Too ugly even for C++.

> Again, thanks and if there is a better place for this discussion
> please point me there.

comp.lang.c++.moderated, Stack Overflow, choose your poison.

-- James
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130522/776291aa/attachment.html>

More information about the cfe-dev mailing list