Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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++ 什么';s在偏序期间成员函数模板的原始类型_C++_Templates_Language Lawyer - Fatal编程技术网

C++ 什么';s在偏序期间成员函数模板的原始类型

C++ 什么';s在偏序期间成员函数模板的原始类型,c++,templates,language-lawyer,C++,Templates,Language Lawyer,以这个例子为例 struct A{}; 模板结构B{ 模板整型运算符*(R&);/#1 }; 模板整型运算符*(T&,R&);//#2. 偏序将应用于#1和#2,以选择最佳可行的功能模板 两组类型用于确定偏序。对于涉及的每个模板,都有原始函数类型和转换函数类型。演绎过程使用转换后的类型作为参数模板,使用其他模板的原始类型作为参数模板。对于偏序比较中涉及的每种类型,此过程执行两次:一次使用转换模板-1作为参数模板,模板-2作为参数模板,另一次使用转换模板-2作为参数模板,模板-1作为参数模板 偏

以这个例子为例

struct A{};
模板结构B{
模板整型运算符*(R&);/#1
};
模板整型运算符*(T&,R&);//#2.
偏序将应用于
#1
#2
,以选择最佳可行的功能模板

两组类型用于确定偏序。对于涉及的每个模板,都有原始函数类型转换函数类型。演绎过程使用转换后的类型作为参数模板,使用其他模板的原始类型作为参数模板。对于偏序比较中涉及的每种类型,此过程执行两次:一次使用转换模板-1作为参数模板,模板-2作为参数模板,另一次使用转换模板-2作为参数模板,模板-1作为参数模板

偏序通过依次变换每个模板来选择两个函数模板中哪一个比另一个更专业(见下一段)

为了生成转换后的模板,对于每个类型、非类型或模板模板参数(包括其模板参数包),分别合成一个唯一的类型、值或类模板,并将其替换为模板函数类型中该参数的每次出现。[ 注意:在为非类型模板参数合成的值的类型中替换占位符的类型也是唯一的合成类型。 — 尾注 ] 如果只有一个函数模板M是某类a的非静态成员,则认为M在其函数参数列表中插入了新的第一个参数。将cv作为M的cv限定符(如果有),则新参数的类型为“对cv a的右值引用”如果M的可选ref限定符为&&或者如果M没有ref限定符,并且另一个模板的第一个参数具有右值引用类型。否则,新参数的类型为“对cv A的左值引用”

因此,
#2
的原始类型是
int操作符*(T&,R&)
,它的转换类型是
int操作符*(UniqueA&,UniqueB&)
,对
#2
的原始类型毫无疑问。但是,我不知道
#1
(成员函数模板)的原始类型是什么

该规则的结构似乎应将上述规则中强调的部分视为生成转换模板的步骤。
因此,无论是
#1
的原始类型是
int操作符*(B&,R&)
还是
int操作符*(R&)
。如果是后者,那就不符合常识。既然
int操作符*(R&)
int操作符*(t&,R&)
与参数数量不匹配,如何比较它们(A和P)


如何正确阅读生成转换模板的规则?如果强调的部分不被视为转换的一个步骤,而是偏序过程中成员函数的一般规则,那么在转换过程之后放置这样的规则是否会产生误导?

是的,这有点让人费解正如您所观察到的,类非静态成员函数的“原始类型”缺少插入的
this
参数是没有意义的

唯一可行的方法是,第3款中的后续段落适用于[temp.Decrete.partial]另一侧的“原始”函数类型以及“转换”函数类型。对于第二段目前的第一句话,您可以这样理解,即“每个”适用于转换后的函数类型和原始函数类型:

作为成员函数的每个函数模板M都被认为具有类型为X(M)[……]的新的第一个参数

然而,自年通过CWG 2445决议以来,我们有了另一句话:

如果通过参数顺序相反的重写候选函数[…]考虑正好一个函数模板,则其转换模板中函数参数的顺序将相反

因此,我们很清楚地看到,这种反转不对称地应用,产生了一个荒谬的结果。从正面来看,它应该如何解读是相当清楚的;对函数类型的调整(
this
insertion and parameter reversion)应该在独特类型合成/替换之前应用,并应用于“original”与变换后的函数类型相同


据我所知,这个缺陷似乎没有报告给核心语言工作组;它没有出现在列表中。

“原始类型”不是标准中出现的一个术语;你这么说是什么意思?@ecatmur我是指在分批排序期间
#1
的原始类型。“两组类型用于确定偏序。对于涉及的每个模板,都有原始函数类型和转换函数类型。”同意你的观点。我认为第3段中的第二条规则应放在[temp.Decrete.partial]中,为了使其同时适用于原始模板和转换模板。顺便说一句,参数的倒序是什么?我不明白它的意思。你能举个例子解释一下它是什么吗?@jackX这在C++20和spaceship中是新的;比较运算符可以在R上找到成员
=
HS类类型,例如,
“hello”==“hello”s
可以调用
字符串::运算符==(char const*)
。谢谢。我不熟悉c++20标准。我必须研究它。但是,在CWG 2445中。运算符函数
==
可以用作操作的候选函数!=,我只是不知道为什么。你能给我一个最新标准中的链接吗?发现,