2011-10-19 11 views
7

Questa domanda è stata inviata anche a Usenet, dove è più appropriato, ma questo è un forum più ampio e affidabile.Inizializzazione diretta vs uniforme in std :: allocator

std::allocator::construct è definito di trasmettere il suo parametro argomento pacco di opporsi costruzione utilizzando parentesi, pseudonimo-inizializzazione diretta.

Se usato bretelle, pseudonimo inizializzazione uniforme, potremmo inizializzare tipi di dati aggregati da funzioni come std::make_shared e container::emplace. Inoltre, sarebbe accettabile inserire il contenuto di un elenco di inizializzazione nell'elenco di argomenti di tale funzione, , risolvendo il problema della deduzione di tipo initializer_list sotto l'inoltro .

Questa alternativa è stata considerata e rifiutata? È troppo tardi per cambiare lo in uno standard futuro? Sembra che questo sarebbe un cambiamento irrisorio, ma non particolarmente nefasto.

+3

Overflow dello stack superiore a _Usenet_ ?! : P –

+0

@Tomalak: più grande di comp.std.C++ e comp.lang.C++. Moderato, dove ho inviato. E molto più sano del pazzo di comp.lang.C++, con il quale non mi sono preoccupato. – Potatoswatter

+0

Ti sei perso il mio smiley. –

risposta

9

Non so cosa abbia considerato l'SC, ma si tenga presente che l'inizializzazione uniforme in realtà non "funziona" in contesti generici (tranne la costruzione di valori *). Considerate questo tentativo:

template<typename T, typename... Args> 
T 
make(Args&&... args) 
{ 
    return T { std::forward<Args>(args)... }; 
} 

Si ottiene:

assert(make<std::vector<int>>(10, 0).size() == 2); 
assert(std::vector<int>(10, 0).size() == 10); 

e questo non compila:

make<std::vector<int*>>(10u, 0); 

che questo fa:

std::vector<int*>(10u, 0); 

Se la particolare interazione tra l'inoltro perfetto e gli elenchi di inizializzatori che causano questo è stato formalizzato abbastanza presto ho potuto vedere il SC non volendo ripartire da zero.

(*): T {} sta bene anche in contesti generici.

+0

Bah, il costrutto Do The Right Thing. Non sono stato ancora morso da quello. Comunque sarebbe bello avere un'alternativa. Lo standard richiede che 'std :: is_constructible :: value' sia' true' per gli argomenti di 'construct'; l'inizializzazione diretta potrebbe essere un ripiego fornito da un'implementazione sotto l'egida di UB. – Potatoswatter

+0

@Potatoswatt Dal momento che quel carattere restituisce 'true' se il tipo è costruibile usando l'inizializzazione diretta, penso che intendi che il fallback sia un'inizializzazione uniforme. Un'idea interessante, che è retrocompatibile con le regole attuali. –

+0

Sì, certo: vP – Potatoswatter

Problemi correlati