Apparently, given two templates, one that deduces T from T\* and another that deduces T from T&, when used with a raw pointer the T& template is instantiated, instead of T\* (MSVC13):

```
// throws if the given object's space isn't all zero
void VerifyZero(const void * ptr, size_t size);

template <typename T> void VerifyZero(const T * ptr)
{
    VerifyZero(ptr, sizeof(T));
}

template <typename T> void VerifyZero(const T & ref)
{
    VerifyZero(&ref, sizeof(T));
}

```

I really, really don't want T& to supersede T\* in the following:

```
PODStruct * p = ... /* malloc or something, right now doesn't matter... */
VerifyZero(p);  // <- why in the 7 hells does this resolve to &p, sizeof(PODStruct*)???

```

Obviously, I can leave out the reference version of the template, but then that sucks when I really do want to zero-out a POD struct by reference.