§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的非引用,然后将该转换的结果用于直接初始化该引用,而无需考虑用户定义的转换。

07-24 09:45
查看更多