Неоднозначные /rvalue аргументы приводят к тому, что компилятор выбирает неправильную перегрузку
У меня есть домашний шаблон класса под названием Vec
которая является бледной тенью: std::vector<T>
Чтобы не изобретать колесо, перегрузка жатки для assign
скопированы из: std::vector::assign
..так
В рамках тестирования Str
класс,..test код также запускается против std::vector<T>
чтобы обеспечить эквивалентный вывод...
Если std::vector<T>
тогда компилятор выберет правильную перегрузку:
Однако когда Vec<T>
используется, то компилятор настаивает на выборе неверной перегрузки:
Существует очевидный обходной путь путем приведения аргументов к lvalues перед использованием:
Вопрос: учитывая, что оба Vec<T>
а также std::vector<T>
использовать идентичные перегрузки заголовка для их соответствующих assign
...как std::vector<T>
в состоянии реализовать аргументы rvalues, не путая компилятор?
1 ответ
[sequence.reqmts]/14 Для каждого контейнера последовательности, определенного в этом разделе и в разделе 21:
(14.2) - Если функции-члены форм:
template <class InputIterator> // such as insert() rt fx1(const_iterator p, InputIterator first, InputIterator last); template <class InputIterator> // such as append(), assign() rt fx2(InputIterator first, InputIterator last); template <class InputIterator> // such as replace() rt fx3(const_iterator i1, const_iterator i2, InputIterator first, InputIterator last);
называются с типом
InputIterator
это не может считаться входным итератором, тогда эти функции не должны участвовать в разрешении перегрузки.
Это обычно реализуется с оттенком SFINAE. Вы можете проверить заголовки вашей любимой стандартной реализации библиотеки для деталей.