Dies ist der vereinfachte Code:Constructor, Initialisiererliste und unterschiedliches Verhalten in g ++ und Klirren
#include <vector>
class VInitList
{
public:
explicit VInitList(std::vector<int> v){}
};
int main()
{
VInitList vil({{}});
}
und Kompilieren mit g ++ 5.2.1 a diesen Fehler:
error: call of overloaded ‘VInitList(<brace-enclosed initializer list>)’ is ambiguous
VInitList vil({{}});
^
main.cpp:6:5: note: candidate: VInitList::VInitList(std::vector<int>)
VInitList(std::vector<int> v){}
^
main.cpp:3:7: note: candidate: constexpr VInitList::VInitList(const VInitList&)
class VInitList
^
main.cpp:3:7: note: candidate: constexpr VInitList::VInitList(VInitList&&)
Als ich das sah, Compiler-Fehler Ich habe herausgefunden, dass ich aus Versehen {{}}
geschrieben habe (ja, sei nicht gemein zu mir), aber ich kann den Fehler immer noch nicht verstehen. IMHO entweder der Compiler muss die zusätzliche {} loswerden oder einen Syntaxfehler zurückgeben.
Dann habe ich versucht, dies zu kompilieren:
std::vector<int> v = {{{}}};
, die wie vorgesehen funktioniert.
Ich habe nur einen Blick auf Ihr Beispiel geworfen, aber Sie haben ein zusätzliches Paar Klammern auf dem Code-Snippet, das kompiliert wurde, vielleicht deshalb? – Henningsson
Es kompiliert nicht in g ++ 5.2.1, aber es ist in Clang 3.7.0 – FrankS101
Interessant Q. Es scheint, dass in Ihrem Szenario einzelne '{}' in beiden Fällen ausreichen. Der enthaltene Typ ist "int", warum zu komplizieren? :-) – iammilind