Literał ciągu
Obsługa literały ciągów znaków zmienił się z zarządzanych rozszerzeń języka C++ do Visual C++.
W rozszerzenia zarządzane dla projektu języka C++ wskazano literał ciągu zarządzanych przez prefacing ciąg literału z S.Na przykład:
String *ps1 = "hello";
String *ps2 = S"goodbye";
Wydajność między dwoma inicjalizacje okazuje się nietrywialne, jako następujące CIL reprezentacja pokazuje widzianych przez ildasm:
// String *ps1 = "hello";
ldsflda valuetype $ArrayType$0xd61117dd
modopt([Microsoft.VisualC]Microsoft.VisualC.IsConstModifier)
'?A0xbdde7aca.unnamed-global-0'
newobj instance void [mscorlib]System.String::.ctor(int8*)
stloc.0
// String *ps2 = S"goodbye";
ldstr "goodbye"
stloc.0
To niezwykłe oszczędności kosztów tylko zapamiętywanie (lub learning) jako prefiks literałem z S.W nowych składni obsługi literały ciągów znaków jest przezroczyste, ustalona w ramach serwisu.S Nie musi być określony.
Co o przypadkach, w których musimy jawnie bezpośrednie kompilator interpretacja lub innym?W takich przypadkach stosuje się jawne rzutowania.Na przykład:
f( safe_cast<String^>("ABC") );
Ponadto literału ciągu jest dopasowana do String z Konwersja prosta zamiast standardowej konwersji.Chociaż to nie może brzmieć jak znacznie zmienia rozdzielczość zestawy funkcji zastąpionej, które obejmują String i const char* jako konkurencyjne parametrów formalnych.Rozdzielczość, która raz przetłumaczona na const char* wystąpienie jest teraz oznaczony jako niejednoznaczne.Na przykład:
ref struct R {
void f(const char*);
void f(String^);
};
int main () {
R r;
// old syntax: f( const char* );
// new syntax: error: ambiguous
r.f("ABC");
}
Dlaczego jest różnica?Od więcej niż jednego wystąpienia o nazwie f istnieje w ramach programu, wymaga to algorytm rozpoznawania przeciążenia funkcji mają być stosowane do wywołania.Posiadanie rozdzielczości funkcji przeciążenie przebiega w trzech krokach.
Kolekcja funkcji kandydata.Funkcje kandydat są metody w zakresie, które leksykalnie zgodny z nazwą funkcja wywoływana.Na przykład, od f() jest wywoływana za pośrednictwem instancji R, wszystkie o nazwie funkcji f nie są członkiem R (lub jego hierarchii klasy bazowej) nie są funkcje kandydata.W naszym przykładzie dostępne są dwie funkcje kandydata.Są to funkcje dwóch R o nazwie f.Wywołanie nie działa w tej fazie, jeśli zestaw funkcji kandydat jest pusty.
Zestaw funkcji zdolnych do życia spośród funkcji kandydata.Funkcja zdolnych do życia jest, że mogą być wywoływane z argumentami określony w wywołaniu, biorąc pod uwagę liczbę argumentów i ich typy.W naszym przykładzie obie funkcje kandydat są również funkcje zdolnych do życia.Wywołanie nie działa w tej fazie, jeśli zestaw funkcji zdolnych do życia jest pusty.
Wybierz funkcję, która reprezentuje najlepszego dopasowania wywołania.Polega to na ranking konwersji stosowane do przekształcania argumenty typu parametry funkcji zdolnych do życia.Jest to stosunkowo prosta o jeden parametr funkcji; staje się nieco bardziej złożony, gdy istnieje wiele parametrów.Wywołanie nie działa w tej fazie, jeśli nie zostanie odnaleziony odpowiednik najlepszych.To znaczy jeśli konieczne do przekształcenia typ argumentu rzeczywisty typ parametrów formalnych konwersje są równie dobre.Wywołanie jest oflagowana jako niejednoznaczne.
W rozdzielczości tego wywołania wywoływany zarządzane rozszerzenia const char* wystąpienie jako najlepsze dopasowanie.W nowe elementy składni, należy dopasować konwersji "abc" do const char* i String^ teraz są równoważne — to znaczy, równie dobre – a więc wywołanie jest oznaczony jako złe — to znaczy, jako niejednoznaczne.
Prowadzi to nam na dwa pytania:
Jaki jest typ argumentu rzeczywiste, "abc"?
Co to jest algorytm ustalania, kiedy jeden typ konwersji jest lepszy od drugiego?
Typu literał ciągu "abc" jest const char[4] -należy pamiętać, że istnieje niejawna znak odcinające null na końcu każdego łańcucha literału.
Algorytm ustalania, kiedy jeden typ konwersji jest lepszy od drugiego polega na umieszczeniu konwersje typów możliwe w hierarchii.W tym miejscu w moim zamyśle tej hierarchii — te konwersje, oczywiście, są ukryte.Przy użyciu notacji jawne rzutowania zastępuje w sposób podobny do hierarchii nawiasy zastępuje pierwszeństwo operatorów zwykle wyrażenia.
Najlepiej jest dokładny odpowiednik.Niespodziewanie argumentu być dokładne dopasowanie, to nie musi być dokładnie zgodny typ parametru; po prostu musi być wystarczająco blisko.Jest to klucz do zrozumienia, co się dzieje w tym przykładzie, a jak zmienił się język.
Promocja jest lepszy niż standardową konwersją.Na przykład, wspieranie short int do int jest lepszy niż konwersja int do double.
Standardową konwersją jest lepszy niż konwersji boksie.Na przykład, konwersja int do double jest lepsza, że bokserskie int do Object.
Konwersja bokserskie jest lepszy niż niejawna konwersja zdefiniowana przez użytkownika.Na przykład boksie int do Object jest lepszy niż stosowanie operatora konwersji z SmallInt wartości klasy.
Niejawna konwersja zdefiniowana przez użytkownika jest lepszy niż konwersja nie jest w ogóle.Niejawna konwersja zdefiniowana przez użytkownika jest ostatnim wypłynięciem przed błędem (z zastrzeżeniem, że posiadanie podpis może zawierać tablica param lub wielokropek na tej pozycji).
Tak co to znaczy powiedzieć, że dokładny odpowiednik nie jest koniecznie dokładnie dopasowanie?Na przykład const char[4] są dokładnie zgodne albo const char* lub String^, a jeszcze niejasności w naszym przykładzie między dwa sprzecznych dokładne dopasowania!
Dopasowanie dokładne, jak to się dzieje, zawiera szereg trivial konwersji.Istnieją cztery konwersje trivial pod C++ ISO, które mogą być stosowane i nadal kwalifikować się jako dokładne dopasowanie.Trzy są określane jako przekształcenia lvalue.Czwarty rodzaj nazywa konwersji kwalifikacji.Trzy przekształcenia lvalue są traktowane jako lepsze dopasowanie niż jeden wymagające konwersji kwalifikacji.
Jedna z form transformacji lvalue jest konwersja w trybie macierzystym tablicy do wskaźnika.Jest to, co się wiąże z dopasowania const char[4] do const char*.W związku z tym, dopasowanie dla f("abc") do f(const char*) jest dokładny odpowiednik.W starszych wcielenia naszego języka to w rzeczywistości był najlepszego dopasowania.
Dla kompilatora oflagować wywołanie jako niejednoznaczny, dlatego wymaga, aby konwersja const char[4] do String^ także być dokładne dopasowanie za pomocą trivial konwersji.Jest to zmiana, który został wprowadzony w nowej wersji językowej.I dlatego wywołanie jest teraz oznaczony jako niejednoznaczne.
Zobacz też
Informacje
System::String obsługa języka Visual C++