Явный конструктор копирования и std :: sort

При сортировке контейнера объектов, имеющих явное копирование ctor, я получаю ошибки компилятора (из g ++ 4.8.2 и clang ++ 3.4, оба в режиме -std = c ++ 11), которые я не понимаю. Я создал простой пример, чтобы продемонстрировать проблему

class A {
public:
  explicit A(int i): m_i(i) {};
  explicit A(const A& other): m_i(other.m_i) {};
  int i() const {return m_i;};
private:
  int m_i;
};

bool is_less(const A& a, const A& b) {
  return a.i() < b.i();
}

int main(int, char*[]) {
  std::vector<A> objects;
  objects.push_back(A(3));
  objects.push_back(A(5));
  objects.push_back(A(-1));

  std::cout << is_less(objects[1], objects[2]);
  std::sort(objects.begin(), objects.end(), is_less);

  for (auto& a: objects) {
    std::cout << a.i() << " ";
  }
  std::cout << std::endl;
}

Это не с

error: 
  no matching constructor for initialization of '_ValueType' (aka 'A')

в Clang ++ и с

error: no matching function for call to ‘A::A(std::remove_reference<A&>::type)

в г ++. Код компилируется и работает нормально, если конструктор копирования не является явным (но я хочу обеспечить, чтобы только ссылки на мои объекты могли использоваться в качестве параметров и возвращаемых значений). Код также компилируется после удаления вызоваstd::sort (такis_less(objects[1], objects[2]) не проблема). Поэтому мой вопрос заключается в том, что делает std :: sort при вызове функции сравнения, которая делает компиляцию этого кода неудачной, и как это исправить.

После долгих исследований единственный вопрос, который подошел к моей проблеме:При инициализации копирования является ли вызов конструктора копирования явным или неявным? который ссылается на ошибку в GCC. Тем не менее, Clang показывает то же самое поведение, поэтому я действительно хотел бы понять, что происходит.

Ответы на вопрос(1)

Ваш ответ на вопрос