Aufruf initializer_list Konstruktor über make_unique/make_shared

Ich versuche zu verwenden std::make_unique instantiieren einer Klasse, deren Konstruktor erhalten, der eine std::initializer_list. Hier ein minimal-Fall :

#include <string>
#include <vector>
#include <initializer_list>
#include <memory>

struct Foo {
    Foo(std::initializer_list<std::string> strings) : strings(strings) {}

    std::vector<std::string> strings;
};

int main(int, char**) {

    auto ptr = std::make_unique<Foo>({"Hello", "World"});

    return 0;
}

Sehen Sie auf Coliru, dass es nicht bauen :

main.cpp:14:56: error: no matching function for call to 'make_unique(<brace-enclosed initializer list>)'
     auto ptr = std::make_unique<Foo>({"Hello", "World"});

So, ist make_unique angeblich nicht in der Lage zu verwenden initializer_lists ? Ist es ein bug in GCC 4.9.1 ? Oder hab ich was übersehen ?

Verspannt Listen nicht abgeleitet werden kann durch das template-argument Abzug. Versuchen make_unique<Foo>(std::initializer_list<std::string>({"Hello", "World"})).
Gut, das sieht aus wie eine Antwort für mich 🙂
Hm, funktioniert das, und hilft es?
Ja, es funktioniert ! Aber pfui, die syntax. initializer_lists sind definitiv seltsame Dinge. In diesem besonderen Fall, ich denke, ich werde einfach zu konstruieren, das unique_ptr aus einer new nennen.
Das ist schade, aber verständlich. std::initializer_list ist eine schreckliche misdesign. Tut mir Leid, dass.

InformationsquelleAutor Quentin | 2014-10-15

Schreibe einen Kommentar