Я думаю, что вы путаете семантику ссылок и значений здесь. Позволяет первой подписи функции, которую вы протестировали:
void fun(const std::vector<std::pair<int,int> > v)
Копирует аргумент функции в новый объект v
, который дополнительно const
-качественен. Такие подписи редко имеют смысл: либо вы хотите передать его как const
ссылку (чтобы избежать копирования), либо вы хотите передать его не-const
значением, потому что тело функции будет изменять аргумент, но должно работать с ним его единственная копия. Кроме того, этот фрагмент:
std::pair<int,int> p = v[i];
прекрасно компилируется с указанной выше сигнатурой функции, потому что копирует векторный элемент в позиции i
в новый pair
объект. Последний может быть видоизменен, но это вообще не влияет на вектор.
Теперь рассмотрим вторую сигнатуру функции:
void fun(const std::vector<const std::pair<int,int> > v)
То же, что и раньше, применимо и здесь, и, кроме того, std::vector<const T>
бесполезен, см. эту ветку для объяснения.
Как это исправить? Если вы не хотите копировать аргумент, но функция не изменяет вектор, передайте его по ссылке const
. Если функция изменяет вектор, и эти изменения должны быть видны на стороне вызова, передайте его как ссылку не const
. Если функция изменяет вектор, но это должно происходить независимо от вектора стороны вызова, передавайте не-1030 * значение.