2017-05-05 40 views
15

Mam następujący kod:GCC odmawia listy inicjalizacji parametru

#include <initializer_list> 
#include <utility> 

enum class Classification 
{ 
    Unspecified, 
    Primary, 
    Secondary 
}; 

class ClassificationMap 
{ 
public: 
    ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content = {}); 
}; 

void foo(ClassificationMap) {} 

int main() 
{ 
    foo({{Classification::Unspecified, 42}}); 
} 

Visual Studio 2013 & 2017 i brzękiem 3.4.1 (i powyżej) zarówno skompilować kod dobrze. Z mojego POV też powinno być dobrze. Jednak GCC 5.1 odmawia go skompilować, z powodu następującego błędu:

<source>: In function 'int main()': 
<source>:22:44: error: could not convert '{{Unspecified, 42}}' from '<brace-enclosed initializer list>' to 'ClassificationMap' 
    foo({{Classification::Unspecified, 42}}); 

[Live example]

(ja przechodząc poprawnego standardowego flagę (-std=c++11) zarówno GCC i Clang).

Czy jest jakiś problem w moim kodzie, czy jest to rzeczywiście błąd GCC?


informacji miejski: w moim prawdziwym kodzie lista initialiser służy do zainicjowania nieuporządkowaną członek mapę klasy ClassificationMap (dlatego jej typ, co to jest). Potrzebuję kodu do pracy w VS2013 & GCC 5.1

+3

Dodanie kolejnego zestawu '' {} wokół nich sprawia, że ​​działa. Bardzo dziwne ... – InternetAussie

+3

Usunięcie '= {}' w 'ClassificationMap (std :: initializer_list > content = {})' powoduje, że kompiluje się w g ++ – NathanOliver

+0

@NathanOliver Dzięki, to świetna wskazówka. Użyję tego jako obejścia w moim kodzie. Wciąż byłbym zainteresowany tym, kto jest w błędzie, ja lub GCC. – Angew

Odpowiedz

0

Tutaj jest dobrym obejście problemu (porzucić wartość domyślna):

class ClassificationMap 
{ 
public: 
    ClassificationMap(std::initializer_list<std::pair<const Classification, int>> content); 
    ClassificationMap() : ClassificationMap({}) {} 

}; 

Trzeba będzie dokładnie zachowanie chcesz i kompiluje wszędzie.

https://godbolt.org/g/WUuMzP