【发布时间】:2013-01-04 19:33:46
【问题描述】:
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 规则推广到这种情况。
我说的对吗?
【问题讨论】:
-
这就像 ADL 的逆... FDL(函数相关查找)。
-
您是否考虑过当您还有一个名为
X的局部变量时这将如何应用?无论如何,我阅读您的问题的方式,您说这是无效的 C++,并询问 C++ 标准是否应该更改。这是错误的地方。 -
谢谢,hvd。你给了我们一个令人信服的理由。
-
如果你问的是标准是否错误,没有; 这就是它成为标准的原因。 你觉得它绝对不方便是一个单独的问题。您的构造函数需要
A::InnerEnum参数值。该枚举定义在A命名空间范围 中,并且在所述相同之外访问时需要解析。
标签: c++ c++11 namespaces argument-dependent-lookup name-lookup