Zgodnie z , powinienem use a gsl::span to pass a half-open sequence.Dlaczego nie mogę skonstruować gsl :: span z listwą inicjalizacyjną z nawiasami klamrowymi
myślę, że oznacza to, że zamiast pisać funkcji jak:
void func(const std::vector<int>& data) {
for (auto v : data) std::cout << v << " ";
}
Wolałbym:
void func(gsl::span<const int> data) {
for (auto v : data) std::cout << v << " ";
}
który ma tę zaletę, że nie ponosi dzwoniący ma swoje dane w vector
lub zmusić ich do skonstruowania tymczasowego vector
. Mogliby na przykład podać std::array
.
Ale częstym use-case jest przekazać listę initializer Brace-ogrodzony:
func({0,1,2,3})
To działa dla funkcji podjęciem std::vector
ale dla funkcji podjęciem gsl::span
otrzymuję komunikat o błędzie:
error C2664: 'void func (GSL :: rozpiętość)': nie można przekonwertować argumentu 1 z 'inicjatora liście' do 'GSL :: rozpiętości'
Wygląda na to, że jest przeznaczony do pobierania dowolnego kontenera.
Czy czegoś takiego brakuje w implementacji Microsoft GSL, czy też istnieje dobry powód, aby temu zapobiec?
Lista usztywniona nie jest pojemnikiem. –
@KerrekSB Czy 'std :: initializer_list' jest kontenerem? – user3467895
Nie, nie jest. Jest to typ obsługi języka, który reprezentuje listy inicjalizatorów ... Ale nawet gdyby to było, to by nie pomogło, ponieważ twój argument nie jest typu 'std :: initializer_list'. To tylko usztywniona lista. –