为什么C++ 11不支持这样的名称查找?

xml*_*lmx 5 c++ namespaces name-lookup argument-dependent-lookup c++11

struct A
{
    enum InnerEnum { X };

    A(InnerEnum x)
    {}
};

int main()
{
    A a(X);
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨: error C2065: 'X' : undeclared identifier

编译器知道构造函数的参数类型是什么,因此当我将X作为参数传递时,编译器应该知道它是一个有效的参数.

我知道这不是ADL(Argument-dependent Name Lookup,也称为Koenig Lookup),但我认为它很有用且非常方便.因为我不必写如下:

A a(A::X);
Run Code Online (Sandbox Code Playgroud)

我认为ADL规则应该推广到这种情况.

我对吗?

AnT*_*AnT 10

C++中的函数调用受函数重载决策的影响.过载分辨率由参数类型驱动.也就是说,语言在这个方向上"有效":参数类型具有给定名称的函数的特定版本.

您建议引入一个反向过程 - 基于函数名称的参数类型推导.这在一般情况下不起作用.它可能适用于只有一个候选函数的情况(如在您的示例中),但是,再次,与在函数重载时在一般情况下工作的原则相反.

当然,当非限定名称上的名称查找除了你的名字之外X还可以看到其他名称时,情况会变得更加复杂.我认为它很容易变得非常违反直觉.XA::X