Warum kann std :: tuple nicht elementweise mit einem std :: tuple von kompatiblen Typen erstellt werden?

9

Ich kann std::tuple elements nicht elementweise von std::tuple kompatibler Typen initialisieren. Warum funktioniert es nicht wie mit boost::tuple ?

%Vor%

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:

%Vor%

Hinweis:

  

Nimmt nicht an der Überladungsauflösung teil, es sei denn,% std::is_constructible<Ti, const Ui&>::value ist true für alle i .

std::is_constructible<Foo<int>, int>::value ist true . Aus dem GCC-Template-Fehler kann ich diese Überlast-Nr. 3:

%Vor%

wird stattdessen ausgewählt. Warum?

    
LogicStuff 09.07.2016, 12:16
quelle

1 Antwort

3

Ü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:

%Vor%

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.

    
Yakk 09.07.2016, 13:23
quelle