【问题标题】:Why does C++11 not support name lookup like this? [closed]为什么 C++11 不支持这样的名称查找? [关闭]
【发布时间】: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


【解决方案1】:

C++ 中的函数调用受函数重载决议的约束。重载决议由参数类型驱动。 IE。该语言专门在该方向上“起作用”:from 参数类型 to 具有给定名称的函数的特定版本。

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

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

【讨论】:

  • 我理解一般适用的复杂性论点。所以,也许不是一般情况,但出于某种原因,我认为这对enums 特别有用。因为它们通常用作函数的任意命名选项。
【解决方案2】:

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

不用了,谢谢。

C++ 有一些(令人讨厌的)惊喜(您知道哪种其他语言需要 explicit 作为关键字?),我认为您的示例没有足够的优点添加到这个意外的语言规则列表中我的代码在意外情况下。

如果您发现在 class-name 后面加上两个冒号需要额外的输入,那么 C++ 语法的一般巴洛克性质现在肯定会让您失望吗?

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2010-11-06
    • 2013-02-03
    • 2011-07-14
    • 2023-03-06
    相关资源
    最近更新 更多