C ++ Почему каждая функция должна иметь спецификатор ссылки при определении перегрузок и ссылочных функций - PullRequest
1 голос
/ 25 апреля 2020

Я не могу понять: почему, если функция-член имеет квалификатор ссылки, все версии с одним и тем же списком должны иметь квалификатор ссылки. Это потому, что при вызове этой функции создается несколько определений?

class A{
   public:
         A sorter() &&;
         A sorter();
         A operator+ (const A&);
       }

Хотя выше есть только объявление функции, этого должно быть достаточно

A a , b;
(a+b).sorter();

Имеет ли определение и вызов функции функция, подобная описанной выше, делает компилятор неспособным определить, какую функцию-член использовать.

1 Ответ

1 голос
/ 25 апреля 2020

Когда одна перегрузка является эталонной, остальные также должны быть. Это работает:

     A sorter() &&;
     A sorter() &;

Другими словами: вы можете выбирать между двумя наборами возможных перегрузок:

  1. const и неконстантными (неквалифицированными).
  2. const& (синоним const в 1), & (неконстантный) и && (значение / временный).
...