次のケースを考えてみましょう
struct A {
operator int();
};
int &&x = A();
仕様はhttp://eel.is/c++draft/dcl.init.ref#5で、参照バインディングが直接か間接かについて述べています
最後の場合 (つまり、初期化式から一時的なものを作成して初期化する場合) を除くすべての場合において、参照は初期化式に直接バインドされていると言われます。
上記のケースは最後のものには一致しませんが、最後から 2 番目のブレットに一致します。
T1 または T2 がクラス型であり、T1 が T2 に関連する参照でない場合、ユーザー定義の変換が考慮されます ... 非参照のコピー初期化について説明したように、変換関数の呼び出しの結果は次のようになります。参照を直接初期化するために使用されます。
したがって、A()
参照へのバインディングは間接バインディングです。続行するには、再び参照の初期化に再帰します。今度は prvalue の typeを使用int
して、初期化を試みますint&&
。これで、直接バインディングを意味する最後の箇条書きになります。
では、参照のバインディングについて何が言えますか...直接または間接的にバインドしますか? 検討する式に応じて、両方を実行しますか (初期化式と変換関数呼び出しの結果)?
特に私たちの場合、段落は、初期化子式に直接バインドし、初期化子式の変換の結果に間接的にバインドすると言っているようです。ただし、オーバーロード解決に関する章http://eel.is/c++draft/over.ics.refでは、
- 参照型のパラメーターが直接 ([dcl.init.ref]) 引数式にバインドされている場合、
- パラメーターが、引数式に変換関数を適用した結果に直接バインドされる場合、
- 参照型のパラメーターが引数式に直接バインドされていない場合、
みたいな場合に
void f(int &&);
f(A());
ケース 1 が適用されますが、適用することを意図していないことは確かです。私の直感では、「最後を除くすべての場合」は、一時的なケースの作成だけでなく、最後の 2 番目の箇条書き、または 2 つの箇条書きを含む「Otherwise:」ブランチ全体 (つまり、 「最後」は箇条書き階層の異なるレベルを指します)。明確にしていただけますか?