В C ++ функция f
, принимающая один аргумент типа T
, может иметь пять разных подписей (без учета volatile
):
void f( T); // #0
void f( T&); // #1
void f(const T&); // #2
void f( T&&); // #3
void f(const T&&); // #4
Предположим, что подмножество из перечисленных выше 5 методов реализован в программе. Каковы полные правила, которым следует компилятор для выбора среди реализованных перегрузок?
Я хотел бы иметь возможность различать, в частности, случаи, в которых:
f
вызывается для переменной, объявленной как T
, const T
, T&
, const T&
, T&&
, const T&&
; f
вызывается на выходе функции, объявленной как возврат либо T
, const T
, T&
, const T&
, T&&
, const T&&
.
PS: Я уже нашел здесь достаточно полный описание того, что происходит без случая № 0, но я хотел бы узнать, что происходит, когда вы добавляете его в микс.
PS2: Причина этого вопроса в том, что я часто провожу тесты, чтобы выяснить, как такое разрешение перегрузки работает в некоторых случаях c. Хотя вы всегда можете решить каждый конкретный случай c путем тестирования, было бы неплохо узнать общее правило раз и навсегда.
РЕЗЮМЕ ИЗМЕНЕНИЙ: volatile
явно игнорируется и уточняет, что только подмножество из # 0-5 могут быть реализованы.