Tak jak ja to widzę, że gdybyśmy mieli jakieś odniesienia RValue X:
T&& x = ...;
i nazwaliśmy niektórych funkcji za pomocą przycisków X jako parametru:
f(x)
Musimy jakoś powiedzieć f czy może on uszkodzić x (lub "przejąć na własność x" lub "jest ostatnim klientem, który używa x").
Jednym ze sposobów, aby zaprojektować to byłoby zakwalifikować każdą rozmowę:
f(yours_now(x)) // ok to damage
f(still_mine(x)) // dont damage
i sprawiają, że bezwarunkowe wezwanie nielegalne.
Innym sposobem byłoby zrobić jeden sposób domyślny:
Albo:
f(yours_now(x)) // ok to damage
f(x) // dont damage
lub
f(x) // ok to damage
f(still_mine(x)) // dont damage
Więc jeśli zgodzimy kwalifikacyjna każde użycie jest zbyt nieporęczne i powinniśmy domyślnych w jedną stronę, która jest najlepsza? Cóż, spójrzmy na koszt przypadkowego wybrania domyślnego w obu przypadkach:
W pierwszym przypadku można było uszkodzić, ale my przypadkowo powiedzieliśmy, że nie było. W tym przypadku tracimy wydajność, ponieważ została wykonana niepotrzebna kopia, ale poza tym nic wielkiego.
W drugim przypadku nie można uszkodzić obiektu, ale przypadkowo o tym mówiliśmy.Może to spowodować trudny do wykrycia błąd logiczny w programie, ponieważ x jest teraz w stanie uszkodzonym, jak zwraca f, ale autor oczekiwał, że tak się nie stanie.
Pierwszy przypadek został wybrany, ponieważ jest "bezpieczniejszy".