Meine Frage betrifft diesen sehr einfachen und kurzen Code, bei dem eine Überladungsauflösung zwischen zwei Nicht-Template-Funktionen versucht wird, die einen Array-Referenzparameter akzeptieren. Die Frage wurde an anderer Stelle, aber in einem Vorlagenableitungskontext gepostet. Hier ist der Code:Initialiser_list als Argument für einen Array-Referenzparameter in einem Nicht-Template-Kontext
#include <iostream>
void foo (const int (&x) [3]) { std::cout << "3\n"; }
void foo (const int (&x) [2]) { std::cout << "2\n"; }
int main()
{
foo({1,2,3});
}
g ++ 4.8.3 kompiliert dieser Code die erste Auswahl der Funktion als (nehme ich an) die einzig gangbare, während Klirren 3.4 ist es nicht kompilieren und sagte, dass der Aufruf von foo nicht eindeutig ist (Warum?).
Welcher Compiler macht das Richtige?
clang kompiliert den Code nicht, auch wenn er die zweite Überladung entfernt: Es scheint, dass eine initializer_list einfach nicht akzeptiert wird, um eine Array-Referenz zu initialisieren.
Ist dieser Buggy?
„Klirren nicht kompiliert den Code sogar das Entfernen der zweiten Überladung "- Es tut für mich (wenn die zweite Überladung entfernt wird, wie Sie sagen), mit clang 3.4.2, solange" -std = C++ 11 "in den Befehlszeilenoptionen enthalten ist . Welche Version und welcher Aufruf schlägt für Sie fehl? – hvd
Sie haben Recht: nach dem Entfernen der zweiten Überladung habe ich den Code kompiliert vergessen das Flag -std = C++ 11. Das tut mir leid. – GSi
Jetzt habe ich einen Befehlsalias definiert, um einen solchen Fehler in Zukunft zu vermeiden ... – GSi