The idiom
The idiom is characterized by an in-class friend function definition appearing in the base class template component of theequal_comparable
is instantiated, the in-class friend definitions produce ''nontemplate'' (and nonmember) functions (operator functions, in this case). At the time the idiom was introduced (1994), the C++ language did not define a partial ordering for overloaded function templates and, as a result, overloading function templates often resulted in ambiguities. For example, trying to capture a generic definition for operator
as
How it works
When the compiler encounters the expression v1 v2 wherev1
and v2
are of type value_type
, it attempts argument-dependent lookup (ADL) for operator
. This lookup includes consideration of friend functions declared in value_type
and its base classes. (Note that if value_type
were an incomplete template instance, ADL would trigger its complete instantiation.)
The Barton–Nackman trick originally relied not on ADL but on a C++ feature called "friend name injection", in which an in-class declaration of a friend function made the function name visible in the immediately surrounding namespace scope (possibly the global scope). When investigating the possibility of removing friend name injection from the C++ programming language, Barton and Nackman's idiom was found to be the only reasonable use of that language rule. Eventually, the rules for argument-dependent lookup were adjusted to replace friend name injection by a less drastic mechanism, described above, that maintained the validity of Barton and Nackman's technique. It is worth noting that, as a consequence of this change, the expression
::operator(v1,v2)
is no longer valid, because qualified names aren't subject to ADL and friend declarations aren't found via ordinary lookup. Note, too, that the friend
specifier is essential, even if the defined friend functions do not actually need to access nonpublic members of the befriending class.
See also
*References
Further reading
* {{DEFAULTSORT:Barton-Nackman Trick Programming idioms Articles with example C++ code C++