Re: Does SFINAE apply to non-template functions?
On 13 Sep., 18:49, Marian Ciobanu <ci...@inbox.com> wrote:
Until recently I was convinced that SFINAE only applies to template
functions, to remove template functions that have an error in their
signature from a list of possible candidates for a call. The errors
considered are limited to "missing type", "nonsensical type" and
perhaps others, but don't include things like "negative-size arrays".
I had some posts in another thread, where I've constantly been told
that SFINAE also applies to non-template functions that are member
of a template class.
The standard does not use the notion of SFINAE, but what
"function-SFINAE"[1] takes advantage of is limited to function
templates and one requirement for a working SFINAE-based overload
selection is that at least one member exists in the viable set.
The mainly relevant section is [temp.deduct]/2 and this always
talks about function templates. I'm not aware of other (non-
template-) related parts of the standard which could be interpreted
as SFINAE-capable.
To increase the chances of my question being understood: to me the
member function "f" below is "non-template", while "g" is a "template
function".
template <typename T>
struct A
{
int f();
template <typename U> int g(U);
};
f is a member function of the class template A, g is a member
function template of the class template A.
Unfortunately the standard itself is somewhat inprecise here.
Both the official standard 14882:2003(E) as well as the most
recent draft N2369 provide the following example in
[temp.mem.func]/1:
"template<class T> class Array {
T* v;
int sz;
public:
explicit Array(int);
T& operator[](int);
T& elem(int i) { return v[i]; }
// ...
};
declares three function templates.[..]"
This is an obvious editorial issue.
Greetings from Bremen,
Daniel Kr?gler
[1]: SFINAE can also occur during selection of class template
specializations.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]