2

考虑以下情况

struct A {
   operator int();
};

int &&x = A();

规范在http://eel.is/c++draft/dcl.init.ref#5中说明了引用绑定是直接的还是间接的

在除了最后一种情况(即,从初始化表达式创建和初始化一个临时变量)之外的所有情况下,引用都被称为直接绑定到初始化表达式。

上面的情况与最后一个不匹配,而是倒数第二个。

如果 T1 或 T2 是类类型,并且 T1 与 T2 没有引用相关,则考虑用户定义的转换... 调用转换函数的结果,如非引用复制初始化所述,则为用于直接初始化引用。

因此对A()引用的绑定是间接绑定。为了继续,我们将再次递归到引用初始化,现在使用 prvalue 类型int,尝试初始化int&&。现在我们将结束最后一个项目符号,这意味着直接绑定

那么对于引用的绑定我们能说些什么……它是直接绑定还是间接绑定?它是否两者都做,取决于您考虑的表达式(初始化表达式与转换函数调用的结果)?

特别是在我们的例子中,这些段落似乎说我们直接绑定到初始化表达式并间接绑定到初始化表达式的转换结果。但是,在关于重载解决的章节http://eel.is/c++draft/over.ics.ref中,我们只区分

  • 当引用类型的参数直接绑定 ([dcl.init.ref]) 到参数表达式时,
  • 如果参数直接绑定到将转换函数应用于参数表达式的结果,
  • 当引用类型的参数不直接绑定到参数表达式时,

对于像这样的情况

void f(int &&);
f(A());

案例 1 适用,但我很确定它不打算适用。我的直觉是,“在除最后一个之外的所有情况下”不仅旨在匹配创建临时案例,而且还匹配倒数第二个项目符号,或者替代包含两个项目符号的整个“否则:”分支(即“最后一个”是指项目符号层次结构上的不同级别)。你能澄清一下吗?

4

0 回答 0