2016-05-12 7 views
1

Wie vermutet, Initialisierung std::pair mit geschweiften Klammern funktioniert nicht, weil std::pair ist kein Aggregat.Aggregat Initialisierung für Array von Std :: Paar

std::pair <int, int> p = {1,2}; // Doesn't work 

jedoch eine Reihe von std::pair funktioniert gut Initialisierung (mit einer Warnung in gcc 4.9)

std::pair <int, int> a_p[] = { 
    {1,2}, 
    {3,4}, 
    {5,6} 
}; // Works fine 

Warum ist das passiert?

EDIT: Diese Frage als mögliches Duplikat markiert wurde von C++11 aggregate initialization for classes with non-static member initializers Doch diese Frage spricht nicht von nicht-statisch-Mitglied-initializers, AFAIK, std::pair hat einen benutzerdefinierten Konstruktor. von http://en.cppreference.com/w/cpp/header/utility, Zitieren

template <class T1, class T2> 
struct pair { 
    typedef T1 first_type; 
    typedef T2 second_type; 

    T1 first; 
    T2 second; 
    pair(const pair&) = default; 
    pair(pair&&) = default; 

    constexpr pair(); 
    pair(const T1& x, const T2& y); 
    template<class U, class V> pair(U&& x, V&& y); 
    template<class U, class V> pair(const pair<U, V>& p); 
    template<class U, class V> pair(pair<U, V>&& p); 
    template <class... Args1, class... Args2> 
     pair(piecewise_construct_t, 
      tuple<Args1...> first_args, tuple<Args2...> second_args); 

    pair& operator=(const pair& p); 
    template<class U, class V> pair& operator=(const pair<U, V>& p); 
    pair& operator=(pair&& p) noexcept(see below); 
    template<class U, class V> pair& operator=(pair<U, V>&& p); 

    void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && 
           noexcept(swap(second, p.second))); 
}; 

Antwort

3

Aggregate Stil Initialisierung von Klassentypen ("einheitliche Initialisierung") hat für die letzten 5 Jahre legal, da C++ 11 veröffentlicht wurde.

Ältere Versionen von gcc standardmäßig auf dem alten C++ 03-Standard (oder dem noch älteren C++ 98), aber wissen C++ 11, so wird unter bestimmten Umständen C++ 11 Regeln anwenden, wo dies ist relativ eindeutig. Das ist die Bedeutung der Warnung:

warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 

Einige sogar ältere Versionen von gcc können ihre eigenen (pre-C++ 11) Erweiterungen anwenden und so unterschiedliche Warnungen geben.

Sie sollten mindestens im C++ 11-Modus kompilieren oder einen modernen Compiler verwenden, der standardmäßig C++ 11 oder C++ 14 verwendet, wie z. B. gcc 6.1.

+0

Unterscheidet sich die Aggregat-Initialisierung von der einheitlichen Initialisierung? 'std :: pair' hat benutzerdefinierte Konstruktoren, die es zu einem Nicht-Aggregat machen. Es kann jedoch immer noch mithilfe der Aggregatsyntax initialisiert werden. –

+0

@MukulGupta einheitliche Initialisierung ist die Verwendung der Liste-Initialisierung-Syntax, um alles zu initialisieren - Primitive, Aggregate, Klassen mit benutzerdefinierten Konstruktoren. Die Unterscheidung zwischen Aggregaten und Klassen mit benutzerdefinierten Konstruktoren ist in neueren Versionen von C++ weniger relevant. – ecatmur

Verwandte Themen