2013-03-26 14 views

risposta

11

Un costruttore che richiede un std::initializer_list è considerato quando si utilizza lista-inizializzazione. Questa è un'inizializzazione che comprende un elenco di inizializzazione rinforzato:

QVector<int> v{1, 2, 3, 4, 5}; 
// or equivalently 
QVector<int> v = {1, 2, 3, 4, 5}; 

Si noti che questa è una funzione di C++ 11. Infatti, la prima sintassi è nuova per C++ 11, mentre la seconda potrebbe essere stata utilizzata in C++ 03 per l'inizializzazione degli aggregati.

È inoltre possibile utilizzare inizializzazione diretta e passare il lista di inizializzazione come argomento:

QVector<int> v({1, 2, 3, 4, 5}); 

Dato che il costruttore non è explicit, può essere utilizzato anche in altri modi interessanti:

  1. Passando un argomento QVector:

    void foo(QVector<int>); 
    
    foo({1, 2, 3, 4, 5}); 
    
  2. Tornando un QVector:

    QVector<int> bar() 
    { 
        return {1, 2, 3, 4, 5}; 
    } 
    

§8.5.4 Lista inizializzazione [dcl.init.list]:

Un costruttore è un inizializzatore-list costruttore se il suo primo parametro è di tipo std::initializer_list<E> o un riferimento a possibilmente qualificato cv std::initializer_list<E> per alcuni tipi E, e anche lì non ci sono altri parametri o tutti gli altri parametri hanno argomenti predefiniti (8.3.6).

§13.3.1.7 inizializzazione di elenco-inizializzazione [over.match.list]:

Quando gli oggetti di tipo non-aggregato classe T sono elenco inizializzata (8.5.4), la risoluzione di sovraccarico seleziona il costruttore in due fasi:

  • Inizialmente, le funzioni candidate sono i costruttori inizializzatore-list (8.5.4) della classe T e la lista degli argomenti consiste nella lista di inizializzazione come un singolo argomento.

  • [...]

+0

Se una funzione ha un argomento QVector come 'Fun (QVector )', si può chiamare come 'Fun (QVector {1,2})' ? Grazie. – user1899020

+2

@ user1899020 Sì, è possibile. In effetti, questo costruttore di 'QVector' non è' explicit', quindi puoi anche fare 'Fun ({1, 2, 3})'. –

+0

'QVector v {1, 2, 3, 4, 5}' anche non è necessario '()' come 'QVector v ({1, 2, 3, 4, 5})'.Se aggiungo(), penso che dovrebbe funzionare anche. Destra? – user1899020

Problemi correlati