以下では&&
、ユニバーサルリファレンスですか?
template <class Function = std::greater<int> > void f(Function&& f = Function());
以下では&&
、ユニバーサルリファレンスですか?
template <class Function = std::greater<int> > void f(Function&& f = Function());
この用語は、通常の右辺値参照、つまりテンプレートコード内の右辺universal reference
値参照を区別するためにScottMeyersによって作成された用語です。これは、テンプレートコードに関係する参照折りたたみルールのために重要です。したがって、この用語は、教育を支援するために使用されます。それがaと呼ばれる理由は、それが何にでもバインドできるからです。int&&
T&&
unversal reference
universal reference
C ++言語にFunction&&
はaのようなものはなく、言語に関する限り、右辺値の参照であることに注意してください。しかし、そうです、スコット・マイヤーの作り上げられた用語でFunction&&
は、universal reference
あなたの例ではそうです。
&&はユニバーサルリファレンスですか?
ある種。イースターバニーやサンタクロースのように、実際には普遍的な参照のようなものはありません(私があなたのためにそれを台無しにした場合は申し訳ありません)。ユニバーサルリファレンスという用語は、標準には表示されません。これは、「特別な控除ルール」がアクティブな場合にテンプレート化された右辺値参照を説明するために、ScottMeyersによって造られた用語です。
表示するのは有効なコードです。この場合、特別控除規則が適用されます。つまり、左辺値引数A
をに渡すとf
、Function
はに推論されA&
ます。したがって、スコットの定義によれば、そうFunction
です、「普遍的な参照」です。
それのように見えますが、関数で呼び出されたときに引数の型をstd::forward<Function>
正しく転送します。