Ich kann std::tuple
elements nicht elementweise von std::tuple
kompatibler Typen initialisieren. Warum funktioniert es nicht wie mit boost::tuple
?
Live auf Coliru (GCC oder Clang und libstdc ++ werden jedoch nicht kompiliert Clang und libc ++ kompiliert ohne Fehler )
std::tuple
macht keine elementweise Konstruktion und instanziiert Foo<int>::Foo<std::tuple<int>>
anstelle von Foo<int>::Foo<int>
. Ich dachte std::tuple::tuple
überlastet nein. 4 und 5 waren genau zu diesem Zweck:
Hinweis:
Nimmt nicht an der Überladungsauflösung teil, es sei denn,%
std::is_constructible<Ti, const Ui&>::value
isttrue
für allei
.
std::is_constructible<Foo<int>, int>::value
ist true
. Aus dem GCC-Template-Fehler kann ich diese Überlast-Nr. 3:
wird stattdessen ausgewählt. Warum?
Überladungen (4) und (5) sind schlechter als (3), wenn sie tuple&
übergeben werden: sie sind const&
und &&
Überladungen, während (3) genau durch die Magie der perfekten Weiterleitung übereinstimmt.
(3) ist gültig, weil Ihr Foo(U&&)
-Konstruktor übermäßig gierig ist.
Fügen Sie SFINAE-Checks zu Foo(U&&)
hinzu, damit es nicht übereinstimmt, wenn es nicht erstellt werden kann:
Der Rvalue-Fall sollte jedoch funktionieren oder mehrdeutig sein. Wenn Sie das Fehlerprotokoll Ihres Live-Beispiels betrachten, ist der einzige Fehler, den ich sehe, der Wert lvalue.
Tags und Links c++ c++11 templates stdtuple boost-tuples