Неоднозначные /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. Вы можете проверить заголовки вашей любимой стандартной реализации библиотеки для деталей.

Другие вопросы по тегам