[Bug c++/60514] New: SFINAE using decltype fails
boris at dolgov dot name
gcc-bugzilla@gcc.gnu.org
Thu Mar 13 07:27:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60514
Bug ID: 60514
Summary: SFINAE using decltype fails
Product: gcc
Version: 4.8.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: boris at dolgov dot name
Hello!
Looks like there are some problems with SFINAE when calling an overloaded
function from template function.
Please, see the following code:
#include <vector>
using namespace std;
struct X { void x() {} };
template<class T> auto f(T& t) -> decltype(t.begin(), void())
{
f(*t.begin());
}
template<class T> auto f(T& t) -> decltype(t.x(), void())
{
}
int main()
{
vector<X> a(1);
f(a);
}
It compiles with clang, but with g++-4.8.1 I get the following error:
test.cpp: In instantiation of ‘decltype ((t.begin(), void())) f(T&) [with T =
std::vector<X>; decltype ((t.begin(), void())) = void]’:
test.cpp:21:5: required from here
test.cpp:10:14: error: call of overloaded ‘f(X&)’ is ambiguous
f(*t.begin());
^
test.cpp:10:14: note: candidates are:
test.cpp:8:24: note: decltype ((t.begin(), void())) f(T&) [with T = X; decltype
((t.begin(), void())) = void]
template<class T> auto f(T& t) -> decltype(t.begin(), void())
^
test.cpp:13:24: note: decltype ((t.x(), void())) f(T&) [with T = X; decltype
((t.x(), void())) = void]
template<class T> auto f(T& t) -> decltype(t.x(), void())
^
decltype(t.begin(), void()) with T = X obviously can't be void.
If I replace the line f(a) with f(*a.begin()), everything works correctly.
More information about the Gcc-bugs
mailing list