C++ 匿名结构中声明的函数的名称解析
在C++ 匿名结构中声明的函数的名称解析,c++,namespaces,c++17,language-lawyer,c++20,C++,Namespaces,C++17,Language Lawyer,C++20,在f定义的参数列表中,下列代码中的A、B、C的名称解析是否有效 namespace ns { struct A {}; struct S { struct B {}; struct { struct C {}; void f(A, B, C); } x; }; } #include <type_traits> void std::type_identity_t<decltype(ns::S::x)>::f
f
定义的参数列表中,下列代码中的A
、B
、C
的名称解析是否有效
namespace ns
{
struct A {};
struct S
{
struct B {};
struct
{
struct C {};
void f(A, B, C);
} x;
};
}
#include <type_traits>
void std::type_identity_t<decltype(ns::S::x)>::f(A, B, C) {}
int main()
{
}
ns
{
结构A{};
结构
{
结构B{};
结构
{
结构C{};
无效f(A、B、C);
}x;
};
}
#包括
void std::type_identity_t::f(A,B,C){}
int main()
{
}
实际上它是在最新的clang
中发出的
[basic.lookup.unqual]/8对于类X
的成员,使用的名称。。。在X
定义之外的类成员定义中,应按照成员的声明器id(24)以以下方式之一声明:…
(8.2)-应为
X类成员或
(8.3)-如果X
是Y
(11.4.10)类的嵌套类,则应为Y
的成员,。。。或
…
(8.5)-如果X
是命名空间N
的成员,或者是N
成员的类的嵌套类。。。在使用名称之前,请在命名空间N
或N
的封闭命名空间之一中
脚注24)即出现在参数声明子句或noexcept说明符中的类型中的非限定名称
这里X
是decltype(ns::S::X)
,Y
是S
,N
是ns
。因此,A
通过(8.5)找到,B
通过(8.3)找到,C
通过(8.2)找到。我不确定我是否理解你的问题。您希望详细说明哪一部分?类型标识对名称查找的影响?是。它是否应该禁止最后一个:
右侧的名称解析。这是否回答了您的问题?我找不到关于别名模板的任何信息。这段代码也适用于当前的GCC。你是在要求一个标准的报价来解释它为什么有效吗?但是std::type\u identity\u t
不是一个类(X
)。它是别名模板的一种特殊化。它是一个使用别名命名类的。无论如何引用X
,无论是通过其原始名称、typedef、或使用别名的、或decltype
或其他方式。