K
kurze_frage schrieb:
ist das
Arcoth schrieb:
template<class T>
struct Wrapper {
T value;
template <typename U>
Wrapper<std::remove_reference_t<U>>(U && u): value(std::forward<U>(u)) {}
};
gleichwertig oder besser als
krümelkacker schrieb:
template<class T>
struct Wrapper {
T value;
Wrapper(T const& x): value(x) {}
Wrapper(T && y): value(std::move(y)) {}
};
und wenn ja warum brauch ich im ersteren kein std::move mehr?
Das erste ist ja aktuell nicht gültig und nur eine Lösung für ein Problem, was im zweiten Fall in Kombination mit den vorgeschlagenen Deduktionsregeln auftritt.
Das std::move wird hier effektiv durch perfect forwarding ersetzt, was eben beim Weitergegen von u auch wieder die richtige Wertkategorie herstellt (inklusive Rvalueness).
Ich hatte ja dem Autor des Proposals dieses Beispiel geschickt und damit eine Diskussion zwischen ihm und zwei anderen Komitee-Mitgliedern losgetreten. Ich stand da immer mit im cc und habe bis jetzt 9 Mails bekommen. Die erste Antwort, die ich bekam, sagte im Wesentlichen, dass in der Situation ein "explicit deduction guide" nötig ist. Das könnte z.B. so aussehen:
template<class T>
struct Wrapper {
T value;
Wrapper(T const& x)
: value(x) {}
Wrapper(T && x) -> Wrapper<std::decay_t<T>>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
// "deduction guide"
: value(std::forward<T>(x)) {}
};
Die Frage ist jetzt noch, ob solche "deduction guides" immer explizit sein sollen, damit die Deduktion für T beim Konstruktor funktioniert, ob die impliziten "deduction guides" angepasst werden sollen, oder ob das Proposal so bleiben soll, wie es ist. Da herrscht anscheinend gerade keine Einigkeit.