誰もが知っているかもしれませんが、右辺値参照を参照折りたたみルールと組み合わせて使用して、次のように完全な転送関数を構築しています。
template<typename T>
void f(T&& arg) {
otherfunc(std::forward<T>(arg));
}
f(4);
参照折りたたみルールは次のようになります
+------+-----+--------+
| T | Use | Result |
|------|--------------|
| X& | T& | X& |
| X& | T&& | X& |
| X&& | T& | X& |
| X&& | T&& | X&& |
+------+-----+--------+
したがって、私の例f
では、T
isint&&
とT&&
is がint&& &&
に折りたたまれint&&
ます。
T
私の質問は、が既に推定されている場合、なぜこれらのルールが必要なのint&&
ですか? なぜだろう
template<typename T>
void f(T arg);
f(4);
if isvoid f(int)
の代わりvoid f(int&&)
に? もしが 本当にでが であり であり、したがってである場合、参照の折りたたみルールが適用されないように見えるのに、なぜ参照の折りたたみルールが必要なのですか? これらは私の限られた知識から判断できる唯一の 2 つのオプションなので、明らかに私が知らないルールがあります。T
int&&
T
int
T&&
int&&
void f(int&&)
これについての標準からの引用を見ることも役に立ちます。