Secondo lo C++ Core Guidelines, dovrei use a gsl::span to pass a half-open sequence.Perché non riesco a costruire un gsl :: span con un elenco di inizializzazione racchiuso tra parentesi
penso che significa che invece di scrivere una funzione come:
void func(const std::vector<int>& data) {
for (auto v : data) std::cout << v << " ";
}
dovrei preferire:
void func(gsl::span<const int> data) {
for (auto v : data) std::cout << v << " ";
}
che ha il vantaggio di non assumere il chiamante ha i propri dati in un vector
, o obbligarli a costruire un valore temporaneo vector
. Potrebbero passare un std::array
per esempio.
Ma un caso d'uso comune è quello di passare una doppietta chiuso in lista di inizializzazione:
func({0,1,2,3})
Questo funziona per una funzione di prendere una std::vector
ma per una funzione di prendere una gsl::span
ricevo il seguente messaggio di errore:
errore C2664: 'func void (GSL :: arco)': non è in grado di convertire argomento 1 da 'inizializzazione-list' a 'gsl :: arco'
Sembra gsl::span
has a templated constructor progettato per prendere qualsiasi contenitore.
Si tratta di qualcosa che manca nell'implementazione di Microsoft GSL o c'è una buona ragione per impedire questa pratica?
Un elenco rinforzato non è un contenitore. –
@KerrekSB È un 'std :: initializer_list' un contenitore? – user3467895
No, non lo è. È un tipo di supporto linguistico per rappresentare gli elenchi di inizializzatori ... Ma anche se lo fosse, non sarebbe d'aiuto, perché il tuo argomento non è di tipo 'std :: initializer_list'. È solo una lista rinforzata. –