title: Why was argument dependent lookup invented?
body: <p>Why was argument dependent lookup (ADL) invented? Is it just so we can write <code>cout &lt;&lt; stuff</code> instead of <code>std::operator&lt;&lt;(cout, stuff)</code>? If that is the case, why wasn't ADL limited to operators instead of all functions?</p>
  
  <p>Could the introduction of ADL have been prevented if C++ had had some other way to do generic output of both built-in and user-defined types, for example a type-safe <code>printf</code> via variadic templates?</p>