Перегрузка функций C ++ по типу значения и константе (полная информация) - PullRequest
0 голосов
/ 06 мая 2020

В 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 могут быть реализованы.

1 Ответ

0 голосов
/ 06 мая 2020

Это невозможно. const T&& не имеет смысла, а

struct T{};

void f(T) {}
void f(const T&) {}

int main() {
    T t;
    f(t);
}

вызывает error: call to 'f' is ambiguous

...