66

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 &&、明示的にコピーすることによって行う必要があります。しかし、それが厳密に標準であるかどうかさえわかりません。

4

1 に答える 1