Похоже, что цель состоит в том, чтобы различать вызовы с временными значениями (т. Е. 9
) и «обычной» передачей аргументов.Первый случай может позволить реализации функции использовать оптимизацию, поскольку ясно, что аргументы будут расположены позднее (что является абсолютно бессмысленным для целочисленных литералов, но может иметь смысл для пользовательских объектов).
Однако текущий стандарт языка C ++ не предлагает способ перегрузки специально для «l / r-значимости» аргументов - любое l-значение, передаваемое в качестве аргумента функции, может быть неявно преобразовано в ссылку,поэтому неоднозначность неизбежна.
C ++ 11 представляет новый инструмент для аналогичной цели - используя ссылки на r-значения , вы можете перегрузить его следующим образом
void foo(int x) { ... }
void foo(const int &&x) { ... }
... и foo(4)
(временное значение r, переданное в качестве аргумента) заставит компилятор выбрать вторую перегрузку, в то время как int i = 2; foo(i)
выберет первую.
( note : даже с новым набором инструментов невозможно различить случаи 2 и 3 в вашем образце!)