jeudi 26 février 2015

g++ fails to look up static functions in a template class, is it a bug or standard defined?

When I try some C++11 code like following, it passed in all clang++ available to me that support C++11, but it failed to compile in g++-4.8, g++-4.9 and g++-5.0.



#include <type_traits>
#include <vector>

template <class C, class First, class Last>
struct HasInsertEnd {
template <class U>
static std::false_type Check(...);

template <class U>
static auto Check(U val)
-> decltype(val.insert(val.end(), std::declval<First>(),
std::declval<Last>()),
std::true_type{});

template <class U>
using Deduce = decltype(Check<U>(std::declval<U>()));

using type = typename Deduce<C>::type;
static constexpr bool value = type::value;
};

int main(int argc, char* argv[]) {
static_assert(!HasInsertEnd<int, int, int>::value, "...");
static_assert(HasInsertEnd<std::vector<int>, const int*, const int*>::value,
"...");
return 0;
}


g++ will report errors like:



‘Check’ was not declared in this scope



If I change the calling of Check in the Deduce to HasInsertEnd::Check, both g++ and clang++ will be happy.


I know little about dependent name lookup. The problem is, which behavior is standard?


Aucun commentaire:

Enregistrer un commentaire