2015-08-21 10 views
6

Il codice segue.Clang non può utilizzare l'inizializzazione rinforzata per la conversione definita dall'utente

struct A { 
    A() {} 
}; 

struct B { 
    B() {} 
    explicit operator A() { return A{}; } 
}; 

struct C { 
    A a; 
    C(B b) : a{b} {} 
}; 

Ho un struct A che non è costruibili aggregato (perché ha un costruttore definito). Lo stesso vale per struct B. Ma ha anche un esplicito operatore di conversione definito dall'utente a struct A. Ora il costruttore di struct C prende uno struct B e lo utilizza per costruire struct A. Come in cppreference, l'operatore di conversione può partecipare all'inizializzazione diretta, che credo sia il caso dell'inizializzazione del membro di struct C. Passa a GCC 5.2 (C++ 11). Ma tuttavia non riesce su Clang 3.6. Ho provato con C++ 11, C++ 14 e C++ 1z.

Se cambio a{b} a a(b), passa sia a Clang che a GCC.

Mi chiedo se è un bug di Clang o ho frainteso lo standard?

+4

correlati [Gli operatori di conversione esplicita sono consentiti negli elenchi di inizializzazione rinforzati?] (Http://stackoverflow.com/q/27573928/3953764) –

+2

[funziona in clang ++ 3.8.0] (http://melpon.org/wandbox/permlink/3sDuu76ZIsQPy2ay) –

+0

@PiotrSkotnicki È questo forse http://wg21.cmeerw.net/cwg/issue1467? – dyp

risposta

1

Ci sono stati cambiamenti recenti a causa di clang DR1467 (cfr 22259.)

versione recente di gcc e clang sia fare la cosa giusta: compilare il codice senza errori.

Nel primo round della risoluzione di sovraccarico per l'elenco di inizializzazione dei membri, i costruttori di A vengono scartati poiché non sono costruttori di inizializzatore-elenco.

Successivamente [over.match.list]/p1 riprende

  • Se non viene trovato nessun costruttore di inizializzazione-list praticabile, risoluzione di sovraccarico viene eseguita di nuovo, dove le funzioni candidati sono tutti I costruttori della classe T e l'elenco degli argomenti sono costituiti dagli elementi dell'elenco di inizializzazione.

e questa volta costruttori di A sono tenuti in considerazione. I costruttori di copia e spostamento di A hanno argomenti sufficienti per far corrispondere il processo di risoluzione del sovraccarico e non causano alcuna soppressione della conversione definita dall'utente poiché 13.3.1.3 e 13.3.1.7 (ancora in Clang's code) non si applicano a questi costruttori.

Pertanto vengono immessi nella risoluzione di sovraccarico impostata e [over.best.ics] vale.

Problemi correlati