web-dev-qa-db-ja.com

オブジェクト、右辺値参照、定数参照間の過負荷解決

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 &&_の間のオーバーロードは、事実上、「所有権が与えられている場合は既存のオブジェクトを使用し、そうでない場合はコピーを作成する」ことを意味します。 (これは純粋な値渡しに似ていますが、移動のオーバーヘッドを節約します。)これらのコンパイラーは現在機能しているため、_T const &_および_T &&_をオーバーロードし、明示的にコピーする必要があります。しかし、それが厳密に標準であるかどうかさえわかりません。

58
Potatoswatter

ここでのルールは何ですか?

パラメータは1つしかないため、そのパラメータの3つの実行可能なパラメータ初期化の1つは、両方よりもより適切に一致するである必要があります。他の2つ。 2つの初期化を比較すると、一方が他方より優れているか、どちらも優れていません(区別できません)。

直接参照バインディングに関する特別なルールがないと、言及されている3つの初期化すべてが区別できません(3つの比較すべてで)。

直接参照バインディングに関する特別なルールはint&& より良い const int&ですが、どちらもintより良くも悪くもありません。したがって、最適な一致はありません。

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better

int&& よりも良い const int& 13.3.3.2のため:

S1とS2は参照バインディング(8.5.3)であり、どちらもref修飾子なしで宣言された非静的メンバー関数の暗黙的なオブジェクトパラメーターを参照しません。S1は右辺値参照を右辺値にバインドし、S2は左辺値参照をバインドします。

ただし、初期化の1つが参照バインディングでない場合、このルールは適用されません。

将来の標準では、int &&がintよりも優先される可能性はありますか?参照は初期化子にバインドする必要がありますが、オブジェクトタイプはそれほど制約されていません。したがって、TとT &&の間のオーバーロードは、事実上、「所有権が付与されている場合は既存のオブジェクトを使用し、そうでない場合はコピーを作成する」ことを意味します。

参照バインディングを非参照バインディングよりもよく一致させることを提案します。あなたのアイデアを isocppの将来の提案 に投稿してみませんか。 SOは主観的な議論/意見には最適ではありません。

46
Andrew Tomazos