Expliziter Kopierkonstruktor und std :: sort

Wenn ich einen Container mit Objekten sortiere, die eine explizite Kopie von ctor haben, erhalte ich Compiler-Fehler (von g ++ 4.8.2 und clang ++ 3.4, beide im Modus -std = c ++ 11), die ich nicht verstehe. Ich habe ein einfaches Beispiel erstellt, um das Problem zu veranschaulichen

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;
}

Das scheitert mit

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

in clang ++ und mit

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

in g ++. Der Code wird kompiliert und funktioniert einwandfrei, wenn der Kopierkonstruktor nicht explizit ist (aber ich möchte erzwingen, dass nur Verweise auf meine Objekte als Parameter und Rückgabewerte verwendet werden können). Der Code wird auch nach dem Entfernen des Aufrufs von kompiliertstd::sort (damitis_less(objects[1], objects[2]) ist kein Problem). Daher ist meine Frage, was std :: sort tut, wenn die Vergleichsfunktion aufgerufen wird, bei der das Kompilieren dieses Codes fehlschlägt, und wie dies behoben werden kann.

Nach vielen Nachforschungen war die einzige Frage, die meinem Problem nahe kam, die folgendeIst der Aufruf des Kopierkonstruktors bei der Kopierinitialisierung explizit oder implizit? was auf einen Fehler in gcc verweist. Clang zeigt jedoch dasselbe Verhalten, daher würde ich wirklich gerne verstehen, was los ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage