§8.5.3[dcl.init.ref] / 5要点(5.2.2.1):
重点是我的
最佳答案
这是该标准的附录,旨在通过使用用户定义的转换对类进行间接引用绑定(bind)来解决丢弃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
的非引用,然后将该转换的结果用于直接初始化该引用,而无需考虑用户定义的转换。