转换函数的显式调用和隐式调用有什么区别?
What's the difference between an explicit call and an implicit call of the conversion function?
考虑这个例子:
struct A{
template<class T>
operator T(); // #1
};
struct B:A{
template<class U>
operator U&&(); // #2
};
int main(){
B b;
int a = b; // #3
b.operator int(); // #4
}
根据 [class.member.lookup] p7
If N is a non-dependent conversion-function-id, conversion function templates that are members of T are considered. For each such template F, the lookup set
S(t,T)
is constructed, considering a function template declaration to have the name t
only if it corresponds to a declaration of F ([basic.scope.scope]). The members of the declaration set of each such lookup set, which shall not be an invalid set, are included in the result.
#1
和 #2
都包含在查找结果中,无论 conversion-function-ids 在 #3
中是什么和 #4
。 #3
的 diagnosis 是我们所期望的,换句话说,#1
和 #2
都是候选者,它们是无法区分的。
不过,似乎implementations在处理#4
时,只将#2
作为唯一候选。如上所述,#3
或 #4
的候选集应该相同。我是否忽略了其他一些导致差异的规则?或者,它是实现中的错误吗?
实施还没有跟上新的(已澄清的)规则,这些规则必须在 2020 年大量发明,因为没有任何已发布的标准版本以任何合理的方式描述转换函数模板的查找。
考虑这个例子:
struct A{
template<class T>
operator T(); // #1
};
struct B:A{
template<class U>
operator U&&(); // #2
};
int main(){
B b;
int a = b; // #3
b.operator int(); // #4
}
根据 [class.member.lookup] p7
If N is a non-dependent conversion-function-id, conversion function templates that are members of T are considered. For each such template F, the lookup set
S(t,T)
is constructed, considering a function template declaration to have the namet
only if it corresponds to a declaration of F ([basic.scope.scope]). The members of the declaration set of each such lookup set, which shall not be an invalid set, are included in the result.
#1
和 #2
都包含在查找结果中,无论 conversion-function-ids 在 #3
中是什么和 #4
。 #3
的 diagnosis 是我们所期望的,换句话说,#1
和 #2
都是候选者,它们是无法区分的。
不过,似乎implementations在处理#4
时,只将#2
作为唯一候选。如上所述,#3
或 #4
的候选集应该相同。我是否忽略了其他一些导致差异的规则?或者,它是实现中的错误吗?
实施还没有跟上新的(已澄清的)规则,这些规则必须在 2020 年大量发明,因为没有任何已发布的标准版本以任何合理的方式描述转换函数模板的查找。