1: ADL or Argument Dependant Lookup is used by the compiler to find the correct function to call (which namespace to find it in) depending on the namespace of the arguments passed to that function. A very common example is a call to a formatted output operator where it's difficult to qualify the namespace name: std::cout << std::string{"hello"}; All arguments are in namespace std so even if I have to qualify the namespace for each argument, the correct overload is still found. 2: There are lots of examples on undefined behavior but here are two simple ones: * Integer overflow (though not all integral types): INT_MAX + 1 * Dereferencing pointer that doesn't refer to legal value: int * p; *p = 4; 3: More general. std::begin has overloads for standard arrays as well. 4: Implementation defined behavior is still valid behavior, only that it could be different on other systems. Simple example is the size of a pointer. A program with undefined behavior is faulty and might "work" but you can't expect anything to work. 5: The zero-overhead rule state that features in the language that aren't used by the programmer shouldn't influence the program in any way (such as memory footprint, processing time, binary size etc).