Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 匿名结构中声明的函数的名称解析_C++_Namespaces_C++17_Language Lawyer_C++20 - Fatal编程技术网

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
或其他方式。