提问人:Darius 提问时间:2/28/2022 更新时间:2/28/2022 访问量:101
使用声明 [duplicate] 后,非限定名称查找不会在本地命名空间中查找
Unqualified name lookup does not look in local namespace after using declaration [duplicate]
问:
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);
}
取消注释 () 代码行将删除错误。//
§6.4.1 非限定名称查找 [basic.lookup.unqual]
- 在 [basic.lookup.unqual] 中列出的所有情况下,将按每个相应类别中列出的顺序搜索范围以查找声明; 一旦找到名称的声明,名称查找就会结束。如果未找到声明,则程序的格式不正确。
- 来自 using 指令指定的命名空间的声明在包含 using 指令的命名空间中可见;看 [namespace.udir]. 用于非限定名称查找规则 在 [basic.lookup.unqual] 中描述,来自 using-directive 指定的命名空间被视为 该封闭命名空间。
代码片段编译失败是否因为?name lookup ends as soon as a declaration is found for the name
答:
1赞
Brian Bi
2/28/2022
#1
代码片段是否无法编译,因为一旦找到名称的声明,名称查找就会结束?
你是对的。在表达式中的查找有两个组成部分:overloaded_f
overloaded_f(some_enum)
- 非限定组件:一旦找到声明,它就会停止向外搜索,在这种情况下,这意味着它停止在 。
using A::overloaded_f
- 参数相关组件:仅查看与其参数类型关联的命名空间。在本例中,关联的命名空间为 (在其中声明枚举类型的命名空间)。它找不到命名空间中的任何内容。
A
B
评论