私が機能を持っているとしましょうcopy
:
template <typename Buf>
void copy(
Buf&& input_buffer,
Buf& output_buffer)
{}
input_buffer
はユニバーサル参照でありoutput_buffer
、左辺値参照です。
Reference collapsing rules
input_buffer
確かに、の推定型に関係なくBuf
、ユニバーサル参照であり、実際には左辺値参照であることを確認してoutput_buffer
ください。
Buf
しかし、ここでどのように型が推定されるのだろうか。
copy
r-value as が渡されることがわかりましたinput_buffer
(および l-value as output_buffer
、明らかに)Buf
は非参照型です。
ただし、2 つの左辺値を渡すと、プログラムはコンパイルされません。
int i = 4;
int j = 6;
_copy(i, j);
コンパイラBuf
がint&
. input_buffer
参照の折りたたみ規則に従って、左辺値参照、つまり になり、左辺値参照にもなる& + && -> &
ことを期待しoutput_buffer
ます。& + & -> &
.
問題は、このコードがコンパイルされないのはなぜですか?
(注: 私は必ずしも問題の解決策を求めているわけではありませんが、説明を求めています。)
詳しく説明する必要がある場合は、お気軽にお尋ねください。
編集: 呼び出しの場合: copy(i, j);
GNU GCC コンパイラが与える: エラー: 'copy(int&, int&)' の呼び出しに一致する関数がありません 注: 候補: テンプレート void copy(Buf&&, buf&) 注: テンプレート引数の推定/置換に失敗しました: 注: 推定パラメータ 'Buf' のタイプが競合しています ('int&' と 'int')
電話の場合:
copy<int&>(i, j);
OK。