C++ 为什么允许ADL查找模板名称绑定?

C++ 为什么允许ADL查找模板名称绑定?,c++,C++,我知道对于依赖名称,绑定必须延迟到实例化点。 考虑以下代码: #include <iostream> using namespace std; template <class T> void g(T a) { f(a); } namespace MyNamespace { class X{}; void f(X) { cout << "f(X)\n"; } } void f(int i) { cout << "f

我知道对于依赖名称,绑定必须延迟到实例化点。 考虑以下代码:

#include <iostream>

using namespace std;

template <class T> 
void g(T a)
{
    f(a);
}

namespace MyNamespace
{
    class X{};
    void f(X) {  cout << "f(X)\n"; }
}

void f(int i) { cout << "f(int)\n"; }

int main()
{
    g(MyNamespace::X{});   //1. print f(x)
    //g(1);                //2. not compile
    return 0;
} 
#包括
使用名称空间std;
模板
无效g(T a)
{
f(a);
}
名称空间MyNamespace
{
类X{};
void f(X){cout在示例1中,因为
g()
在全局范围
g(MyNamespace::X{});
不调用ADL。
//ff.h
#include <iostream>

namespace N
{
    class X {};
    int g(X, int i);
}

template<typename T>
double ff(T t, double d)
{
    return g(t, d);
}

//ff.cpp
#include "ff.h"

int N::g(X, int i) { std::cout << "g(X,int)" << std::endl; return i; }

double x1 = ff(N::X{}, 1.1);

//main.cpp
#include "ff.h"

namespace N
{
    double g(X, double d) { std::cout << "g(X,double)" << std::endl; return d; }
}

auto x2 = ff(N::X{}, 2.2);

int main()
{
    extern double x1;
    std::cout<<"x1 = " << x1 << std::endl;
    std::cout << "x2 = " << x2 << std::endl;
    return 0;
}