Jesteśmy ponownie w częściowym zamówieniu ziemi. Rodzaj syntetyzowanych parametrów szablonu funkcji są
T&& // #1: not a forwarding reference
const T& // #2
U&& // #3: a forwarding reference
pre-częściowy transformacji zamawiania strips away referenceness a potem na top-level cv-qualification, pozostawiając nas z gołymi typu we wszystkich trzech przypadkach. Wynika z tego, że we wszystkich trzech przypadkach odliczenie jest skuteczne w obu kierunkach. Jesteśmy teraz w lewo z [temp.deduct.partial]/9 „s tiebreaker:
Jeśli dla danego typu, odliczenie powiedzie się w obu kierunkach (czyli typy są identyczne po powyższych przemian) i zarówno P i były typami referencyjnymi (przed zastępowane typu określonego powyżej):
- jeśli typ z szablonu argument lwartością odniesienia i rodzaju z szablonu parametr nie typ parametr nie jest uważany za przynajmniej tak wyspecjalizowani jak typ argumentu; w przeciwnym razie,
- , jeśli typ z szablonu argumentu jest bardziej kwalifikowany cv niż typ z szablonu parametrów (jak opisana powyżej ), typ parametru nie jest uważany za co najmniej tak wyspecjalizowany jak typ argumentu.
Dla U&&
vs T&&
, ani zasada obowiązuje i nie ma zamawiania. W przypadku modelu U&&
i const T&
typ parametru U&&
nie jest uważany za co najmniej tak wyspecjalizowany jak typ argumentu const T&
na pierwszy punktor.
Częściowe zamówienie powoduje, że # 2 jest bardziej wyspecjalizowany niż # 3, ale stwierdza, że # 1 i # 3 są nierozróżnialne. GCC jest poprawne.
To powiedziawszy, może to być niedopatrzenie w zasadach częściowego zamawiania. Odliczanie szablonów klas jest pierwszym razem, gdy mamy "referencję rwartości do nieuwzględnionego cv parametru szablonu, który nie jest odniesieniem do przekierowania". Poprzednio, w przypadkach podwójnego odwołań, odsyłacze do przekazywania dalej zawsze będą tracić do nieprzesyłowych referencji rvalue na drugim punkcie (ponieważ jedynym sposobem uzyskania nieprzeczytanych referencji rvalue jest cv T&&
dla niektórych niepustych cv
).
Pójdę na to. Odliczenie dotyczy rwartości (referencji). 'ci' jest lwartością' const', i istnieje konstruktor, który przyjmuje jako parametr parametr "const". –
Przepraszam za brak wiedzy, ale jak się nazywa ta składnia '->'? – HolyBlackCat