I know this is nitpicky, but I haven't found references to it (or the whys) in the database.
I am not a lawyer, but I think that according to [0][1], the following program should not compile: #include <iostream> template <typename T> void f (T t) { g (t); } int main () { f<int> (42); } // point of instantiation of f<int>(), g(int) not yet visible void g (int i) { std::cout << i << '\n'; } To my best knowlege, if function g would take a non-intrinsic type, this would be correct, but with raw int, ADL should not take place, i.e. the call to g(int) in f<int>(int) refers to an unresolved symbol. [0] Vandevoorde/Josuttis 10.3.2: Points of Instantiation (http://books.google.de/books?id=EotSAwuBkJoC&pg=PA146&lpg=PA146&dq=vandevoorde+point+of+instantiation&source=bl&ots=iwJ0D7_jhd&sig=1yVPrdPe2Dx1AtoPFDpAkFKIe2Y&hl=de&ei=0WedSYORD42K0AXf24DgBQ&sa=X&oi=book_result&resnum=1&ct=result#PPA147,M1) [1] ISO/IEC 14882:2003(draft) 14.6.4.1 Point of instantiation, Item 1 -- Summary: Incorrect point of instantiation for function template Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: minor Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: phresnel at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41995