The following code fails as expected, because no overload of get
is found. Using std::get
would solve the problem.
#include
ADL is not used when explicit template arguments are involved unless you introduce a template function declaration at the call point. You're using an unqualified form of get
using a non-type template argument 0
, so you need to introduce a template function declaration or use the qualified version of get
as std::get<0>(ar)
.
In standardese [temp.arg.explicit]/8
: (emphasis mine)
[ Note: For simple function names, argument dependent lookup (6.4.2) applies even when the function name is not visible within the scope of the call. This is because the call still has the syntactic form of a function call (6.4.1). But when a function template with explicit template arguments is used, the call does not have the correct syntactic form unless there is a function template with that name visible at the point of the call. If no such name is visible, the call is not syntactically well-formed and argument-dependent lookup does not apply. If some such name is visible, argument dependent lookup applies and additional function templates may be found in other namespaces.
EDIT:
As @Yakk - Adam Nevraumont has pointed out in the comment, without the presence of the template function declaration, the expression get<0>(ar)
will be parsed as (get<0)>(ar)
, i.e as a serie of comparison expressions instead of a function call.