最新草案§8.5.3/5第(5.2.3/5)段(5.2.2.1)中的"user-defined conversions are not considered"是什么意思?

What does the Standard mean by "user-defined conversions are not considered", in bullet point (5.2.2.1) in paragraph §8.5.3/5 of the latest draft?

本文关键字:conversions not are considered 意思 是什么 user-defined 草案 最新 中的      更新时间:2023-10-16

§8.5.3[dcl.init.ref]/5 项目符号 (5.2.2.1):

重点是我的

如果 T1 或 T2

是类类型,并且 T1 与 T2 无关, 用户定义的转换使用用户定义的类型为"cv1 T1"的对象进行复制初始化的规则来考虑 转换(8.5、13.3.1.4、13.3.1.5);如果 相应的非引用复制初始化将格式不正确。 调用转换函数的结果,如 非引用复制初始化,然后用于 直接初始化引用。对于此直接初始化, 不考虑用户定义的转换

这是该标准的附录,旨在解决通过间接引用绑定具有用户定义转换的类来丢弃 cv 限定符的问题。

相关的缺陷是1571。

给出的例子是这样的:

class A {
public:
  operator volatile int &();
};
A a;
const int & ir1a = a.operator volatile int&(); // error!
const int & ir2a = a; // allowed! ir = a.operator volatile int&();

第一个引用初始化无效,因为它会丢弃初始值设定项表达式中的 cv 限定符。但是,在旧规则下,第二个是有效的,因为只考虑转换对象上的 cv 限定符,而不考虑转换运算符返回的引用的 cv 限定符。

我认为您的困惑源于两种可能的转换。考虑用户定义的转换以查看它们是否可以复制初始化cv1 T1的非引用,然后使用该转换的结果直接初始化引用,不考虑用户定义的转换。