3 つの関数すべてを考えると、この呼び出しはあいまいです。
int f( int );
int f( int && );
int f( int const & );
int q = f( 3 );
削除するf( int )
と、Clang と GCC の両方で、左辺値参照よりも右辺値参照が優先されます。しかし、代わりにいずれかの参照オーバーロードを削除すると、f( int )
.
過負荷の解決は通常、厳密な半順序付けによって行われますが、int
互いに同等ではない 2 つのことと同等のようです。ここでのルールは何ですか?これについての不具合報告を思い出したようです。
将来の標準でint &&
優先される可能性はありますか? int
参照は初期化子にバインドする必要がありますが、オブジェクト型はそれほど制約されていません。したがって、T
との間のオーバーロードは、T &&
事実上、「所有権が与えられている場合は既存のオブジェクトを使用し、それ以外の場合はコピーを作成する」ことを意味する可能性があります。(これは純粋な値渡しに似ていますが、移動のオーバーヘッドを節約できます。) これらのコンパイラは現在動作しているため、これは and をオーバーロードT const &
しT &&
、明示的にコピーすることによって行う必要があります。しかし、それが厳密に標準であるかどうかさえわかりません。