B
Barry
The problem brought by one earlier post from comp.lang.c++
http://groups.google.com/group/comp.lang.c++/browse_thread/thread/bf636c48b84957b/
I take part of the question and reproduce the code to represent (partly)
the question.
#include <iostream>
template <class>
void f(...)
{
std::cout << "..." << std::endl;
}
template <class T>
void f(T[1])
{
std::cout << "T" << std::endl;
}
int main()
{
f<int>(0);
f<void>(0);
}
as "array of void" is invalid type, so the f<void> should applies SFINAE
and chooses the "f(...)" version
the code above compiles and runs _expectedly_ with VC8
but fails to compile with Comuea Online, producing the error message:
"ComeauTest.c", line 10: error: array of void is not allowed
void f(T[1])
^
detected during instantiation of "f" based on template argument
<void> at line 18
compiles with gcc 4.3.0 but produced unexpected result, producing
T
T
which means that f<int>, f<void> both chooses the second version.
so who's right about this?
one more question:
should
8.3.5.3 [...] The type of a function is determined using the
following rules. The type of each parameter is determined from its own
decl-specifier-seq and declarator. After determining the type of each
parameter, any parameter of type “array of T†or “function returning
T†is adjusted to be “pointer to T†or “pointer to function returning
T,†respectively.
[...]
the adjustment apply before SFINAE happens?
I guess GCC4.3.0 gives an "yes" answer.
http://groups.google.com/group/comp.lang.c++/browse_thread/thread/bf636c48b84957b/
I take part of the question and reproduce the code to represent (partly)
the question.
#include <iostream>
template <class>
void f(...)
{
std::cout << "..." << std::endl;
}
template <class T>
void f(T[1])
{
std::cout << "T" << std::endl;
}
int main()
{
f<int>(0);
f<void>(0);
}
as "array of void" is invalid type, so the f<void> should applies SFINAE
and chooses the "f(...)" version
the code above compiles and runs _expectedly_ with VC8
but fails to compile with Comuea Online, producing the error message:
"ComeauTest.c", line 10: error: array of void is not allowed
void f(T[1])
^
detected during instantiation of "f" based on template argument
<void> at line 18
compiles with gcc 4.3.0 but produced unexpected result, producing
T
T
which means that f<int>, f<void> both chooses the second version.
so who's right about this?
one more question:
should
8.3.5.3 [...] The type of a function is determined using the
following rules. The type of each parameter is determined from its own
decl-specifier-seq and declarator. After determining the type of each
parameter, any parameter of type “array of T†or “function returning
T†is adjusted to be “pointer to T†or “pointer to function returning
T,†respectively.
[...]
the adjustment apply before SFINAE happens?
I guess GCC4.3.0 gives an "yes" answer.