考虑以下案例
struct A {
operator int();
};
int &&x = A();
规范在http://eel.is/c++draft/dcl.init.ref#5说明参考绑定是直接还是间接
在除最后一个之外的所有情况下(即,从初始化表达式创建和初始化临时),该引用被称为直接绑定到初始化表达式。
上述案例与最后一个案例不匹配,但与最后一个案例相匹配。
如果T1或T2是类类型且T1与T2无参考相关,则考虑用户定义的转换...调用转换函数的结果,如非参考拷贝初始化所述,然后用于直接初始化参考。
因此A()
与引用的绑定是间接绑定。为了继续,我们将再次递归到引用初始化,现在使用类型为int
的prvalue,尝试初始化int&&
。现在我们将以最后一个子弹结束,这意味着直接绑定。
那么我们可以对引用的绑定做些什么呢......它是直接还是间接绑定的?它是否同时执行,取决于您考虑的表达式(初始化表达式与转换函数调用的结果)?
在我们的案例中,段落似乎说我们直接绑定到初始化表达式并间接绑定到初始化表达式上的转换结果。但是,在关于过载结果http://eel.is/c++draft/over.ics.ref的章节中,我们只区分
对于像
这样的案例void f(int &&);
f(A());
案例1适用,但我很确定它无意适用。我的直觉是“在除了最后一个之外的所有情况下”不仅旨在匹配临时创建案例,而且还与第二个最后一个子弹相匹配,或者替代整个“否则:”包含两个子弹的分支(即“最后”是指子弹等级上的不同级别。你能澄清一下吗?