Mechanismus dafür ist hier gut erklärt: Template "copy constructor" does not prevent compiler-generated move constructor, aber ich möchte besser verstehen, warum es so gemacht wird. Ich verstehe, dass der move -Konstruktor nicht generiert wird, selbst wenn ein anderer Konstruktor vom Programmierer geschrieben wird, da dies ein Hinweis darauf ist, dass die Konstruktion eines Objekts nicht trivial ist und der automatisch generierte Konstruktor wahrscheinlich falsch ist. Warum werden Template-Konstruktoren, die die gleiche Signatur wie Kopierkonstruktoren haben, nicht einfach Kopierkonstruktoren genannt?Warum generieren Compiler einen Kopier-/Verschiebungskonstruktor, wenn es einen Vorlagenkonstruktor gibt?
Beispiel:
class Person {
public:
template<typename T>
Person(T&& t) : s(std::forward<T>(t)) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
Person(int n) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
// No need to declare copy/move constructors as compiler will do this implicitly
// Templated constructor does not inhibit it.
//Person(const Person&) = default;
//Person(Person&&) = default;
private:
std::string s;
};
und dann:
Person p("asd"); // OK!
//Person p4(p); // error as Person(T&&) is a better match
wenn ich machen p
konst:
const Person p("asd");
Person p4(p); // thats ok, generator constructor is a better match
aber wenn ich löschen explizit auch einen Umzug Konstruktor mit:
Person(Person&&) = delete;
dann ist die automatische Generierung von Konstruktoren gesperrt.
"* Ich verstehe, dass Move-Konstruktor nicht generiert wird, auch wenn ein anderer Konstruktor vom Programmierer geschrieben wird *" Das ist nicht wahr. Nur das Vorhandensein von Kopierkonstruktoren/-zuweisungen verhindert die Generierung von Bewegungskonstruktoren. –
@NicolBolas danke, ich nachgeschlagenen Artikel 17 in Effective Modern C++, und auch bewegen Konstruktor/Zuweisung Operator und Destruktor verhindert Generierung von Move Konstruktor oder Zuweisungsoperator. – mike