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

时间:2013-01-04 19:33:46

标签: c++ c++11 namespaces argument-dependent-lookup name-lookup

struct A
{
    enum InnerEnum { X };

    A(InnerEnum x)
    {}
};

int main()
{
    A a(X);
}

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

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

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

A a(A::X);

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

我是对的吗?

2 个答案:

答案 0 :(得分:10)

C ++中的函数调用受函数重载决策的影响。过载分辨率由参数类型驱动。即该语言在这个方向上“有效”:参数类型具有给定名称的函数的特定版本。

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

当然,当您对X以及其他名称X进行名称查找时,除了您的A::X之外,其他名称{{1}}还会显示其他内容。我认为它很容易变得非常违反直觉。

答案 1 :(得分:4)

  

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

不,谢谢。

C ++有(令人讨厌的)惊喜(你知道其他语言需要explicit作为关键字吗?),我在你的例子中没有看到足够的优点来添加到这个意外语言列表中在意外情况下阻碍我的代码的规则。

如果你发现类名中的附加类型后面跟着两个冒号太费力了,那么C ++语法的一般巴洛克式特性肯定会让你迟到吗?