Argument-dependent name lookup

In the C++ programming language, argument-dependent lookup (ADL), or argument-dependent name lookup, applies to the lookup of an unqualified function name depending on the types of the arguments given to the function call. This behavior is also known as Koenig lookup, as it is often attributed to Andrew Koenig, though he is not its inventor.
During argument-dependent lookup, other namespaces not considered during normal lookup may be searched where the set of namespaces to be searched depends on the types of the function arguments. Specifically, the set of declarations discovered during the ADL process, and considered for resolution of the function name, is the union of the declarations found by normal lookup with the declarations found by looking in the set of namespaces associated with the types of the function arguments.
Example.
An example of ADL looks like this:
namespace NS {
class A {};
} // namespace NS
int main() {
 NS::A a;
 f(a, 0); // Calls NS::f.
Even though the function is not in namespace NS, nor is namespace NS in scope, the function is found because of the declared types of the actual arguments in the function call statement.
A common pattern in the C++ Standard Library is to declare overloaded operators that will be found in this manner. For example, this simple Hello World program would not compile if it weren't for ADL:
int main() {
 std::string str = "hello world";
 std::cout « str;
Using codice_1 is equivalent to calling codice_2 without the codice_3 qualifier. However, in this case, the overload of operator« that works for codice_4 is in the codice_5 namespace, so ADL is required for it to be used.
The following code would work without ADL (which is applied to it anyway):
int main() {
 std::cout « 5;
It works because the output operator for integers is a member function of the codice_6 class, which is the type of codice_7. 
Thus, the compiler interprets this statement as
std::cout.operator«(5); 
which it can resolve during normal lookup. However, consider that e.g. the codice_8 overloaded codice_2 is a non-member function in the codice_5 namespace and, thus, requires ADL for a correct lookup:
/* will print the provided char string as expected using ADL derived from the argument type std::cout */
operator«(std::cout, "Hi there")
/* calls a ostream member function of the operator« taking a void const*, 
which will print the address of the provided char string instead of the content of the char string */ 
std::cout.operator«("Hi there") 
The codice_5 namespace overloaded non-member codice_2 function to handle strings is another example:
/*equivalent to operator«(std::cout, str). The compiler searches the std namespace using ADL due to the type std::string of the str parameter and std::cout */
std::cout « str; 
As Koenig points out in a personal note, without ADL the compiler would indicate an error stating it could not find codice_2 as the statement doesn't explicitly specify that it is found in the codice_5 namespace.
Interfaces.
Functions found by ADL are considered part of a class's interface. In the C++ Standard Library, several algorithms use unqualified calls to codice_15 from within the codice_5 namespace. As a result, the generic codice_17 function is used if nothing else is found, but if these algorithms are used with a third-party class, codice_18, found in another namespace that also contains codice_19, that overload of codice_15 will be used.
Criticism.
While ADL makes it practical for functions defined outside of a class to behave as if they were part of the interface of that class, it makes namespaces less strict and so can require the use of fully qualified names when they would not otherwise be needed. For example, the C++ standard library makes extensive use of unqualified calls to codice_17 to swap two values. The idea is that then one can define an own version of codice_15 in one's own namespace and it will be used within the standard library algorithms. In other words, the behavior of
namespace N {
struct A {};
} // namespace N
A a;
A b;
std::swap(a, b);
may or may not be the same as the behavior of
using std::swap;
swap(a, b);
(where codice_23 and codice_24 are of type codice_25) because if codice_26 exists, the second of the above examples will call it while the first will not. Furthermore, if for some reason both codice_26 and codice_28 are defined, then the first example will call codice_28 but the second will not compile because codice_30 would be ambiguous.
In general, over-dependence on ADL can lead to semantic problems. If one library, codice_31, expects unqualified calls to codice_32 to have one meaning and another library, codice_33 expects it to have another, then namespaces lose their utility. If, however, codice_31 expects codice_35 to have one meaning and codice_33 does likewise, then there is no conflict, but calls to codice_32 would have to be fully qualified (i.e. codice_38 as opposed to codice_39) lest ADL get in the way.