使用声明 [duplicate] 后,非限定名称查找不会在本地命名空间中查找

Unqualified name lookup does not look in local namespace after using declaration [duplicate]

提问人:Darius 提问时间:2/28/2022 更新时间:2/28/2022 访问量:101

问:

namespace A
{
    int overloaded_f(float some_float);
    enum class Enum { Value };
}

namespace B
{
    int overloaded_f(A::Enum some_enum);
    int f(A::Enum some_enum){
        using A::overloaded_f;
        // using B::overloaded_f;

        // return B::overloaded_f(some_enum) + overloaded_f(0.0f);
        return overloaded_f(some_enum) + overloaded_f(0.0f);

        /* error: cannot convert 'A::Enum' to 'float'
           14 |         return overloaded_f(some_enum) + overloaded_f(0.0f);
              |                             ^~~~~~~~~
              |                             |
              |                             A::Enum
        */
    }
}

int main(){ 
    A::Enum a = A::Enum::Value;
    return B::f(a);
}

链接到 Godbolt

取消注释 () 代码行将删除错误。//

basic.lookup.unqual

§6.4.1 非限定名称查找 [basic.lookup.unqual]

  1. 在 [basic.lookup.unqual] 中列出的所有情况下,将按每个相应类别中列出的顺序搜索范围以查找声明; 一旦找到名称的声明,名称查找就会结束。如果未找到声明,则程序的格式不正确。
  2. 来自 using 指令指定的命名空间的声明在包含 using 指令的命名空间中可见;看 [namespace.udir]. 用于非限定名称查找规则 在 [basic.lookup.unqual] 中描述,来自 using-directive 指定的命名空间被视为 该封闭命名空间。

代码片段编译失败是否因为?name lookup ends as soon as a declaration is found for the name

C++ 语言-律师 参数依赖查找 using 指令

评论


答:

1赞 Brian Bi 2/28/2022 #1

代码片段是否无法编译,因为一旦找到名称的声明,名称查找就会结束?

你是对的。在表达式中的查找有两个组成部分:overloaded_foverloaded_f(some_enum)

  • 非限定组件:一旦找到声明,它就会停止向外搜索,在这种情况下,这意味着它停止在 。using A::overloaded_f
  • 参数相关组件:仅查看与其参数类型关联的命名空间。在本例中,关联的命名空间为 (在其中声明枚举类型的命名空间)。它找不到命名空间中的任何内容。AB