Der folgende Code kompiliert nicht in GCC 4.7.2 oder Clang 3.2:Kopieren einer std :: vector <std :: function <void()>> unter Verwendung einer einheitlichen Initialisierung nicht möglich. Ist das richtig?
#include <vector>
#include <functional>
int main()
{
std::vector<std::function<void()>> a;
std::vector<std::function<void()>> b{a};
}
Das Problem ist, dass der Compiler eine initializer_list b verwendet wird, zu schaffen versuchen, wenn klar sollte es nur die Kopie Konstruktor aufrufen werden. Dies scheint jedoch das gewünschte Verhalten zu sein, da der Standard besagt, dass Initialisiererlisten-Konstruktoren Vorrang haben sollten.
Dieser Code würde für andere std :: vector funktionieren, aber für eine std :: -Funktion kann der Compiler nicht wissen, ob Sie den Konstruktor initializer_list oder einen anderen Konstruktor haben möchten.
Es scheint nicht, dass es einen Weg gibt, und wenn das der Fall ist, können Sie nie einheitliche Initialisierung in Vorlagencode verwenden. Was wäre eine riesige Schande.
Visual Studio (2012 November CTP) auf der anderen Seite nicht darüber beschweren. Aber die Unterstützung von initializer_list ist im Moment nicht sehr gut, also könnte es ein Fehler sein.
Danke für die Antwort. Der Link LWG 2132 spricht eigentlich von einem ähnlichen, aber unterschiedlichen Problem, das gerade eben dieses Problem behebt. Das heißt, das Problem wird nur für std :: function behoben, nicht für andere Typen mit Vorlagenkonstruktoren. Ich denke, dass meine neue Regel für die uniforme Initialisierung lautet: "Verwenden Sie es, wo immer Sie können, außer wenn das Objekt einen Initializer_list -Konstruktor hat. Verwenden Sie es dann nur, wenn Sie diesen Konstruktor wollen."Das bedeutet auch, dass Sie es nicht in Vorlagencode verwenden können. –
Ich bevorzuge die Regel" schreiben Sie nicht bedingte Konstruktorvorlagen, die implizite Konvertierung von jedem Typ erlauben. "Wenn Sie solche Typen nicht erstellen, dann haben Sie gewonnen." Probleme für Leute, die versuchen, Ihren Typ mit Klassen zu verwenden, die Initialisierungslisten-Konstruktoren haben Die Standardbibliothek folgte dieser Regel nicht, aber das wurde für 'std :: function' korrigiert. –