std::exchange
została zaproponowana w N3511bez domyślnego szablonu argument, a następnie N3608 z domyślnym argumentem szablonu. Zauważ, że w N3608 następujące rozumowanie zostało dostarczone:
Nadanie Drugi szablon argumentu domyślną wartość ustala dwóch następujących przypadkach:
DefaultConstructible x = ...;
if (exchange(x, {})) { ... }
int (*fp)(int);
int f(int);
double f(double);
/*...*/ exchange(fp, &f) /*...*/
Pierwszym przykładem jest przydatność jest oczywiście, że pozbawionym typu tymczasowy {}
zostanie wydedukowany na T
. Drugim przykładem jest bardziej zaangażowane:
14.8.2 Szablon odliczenie argumentu [temp.deduct]
5 Uzyskane podstawione i dostosować rodzaj funkcja jest stosowana jako rodzaj matrycy funkcyjnych matrycy odliczanie argumentów. Jeśli argument szablonu nie został wyprowadzony, a odpowiadający mu parametr szablonu ma domyślny argument, argument szablonu zostanie określony jako przez podstawienie argumentów szablonu określonych dla poprzednich parametrów szablonu na domyślny argument. Jeśli podstawienie powoduje niepoprawny typ, jak opisano powyżej, odliczenie nie powiedzie się.
14.8.2.5 Wydedukowania argumenty szablon z rodzaju [temp.deduct.type]
4 W większości przypadków, wartości typów, szablony, a nie typu, który jest stosowany do komponowania P uczestniczy w odrzucenie argumentu szablonu.To znaczy, mogą one być użyte do określenia wartości argumentu szablonu, a tak określona wartość musi być zgodna z wartościami określonymi w innym miejscu. Jednak w pewnych kontekstach wartość nie bierze udziału w odliczaniu typów, ale zamiast tego używa wartości argumentów szablonu, które zostały albo wyprowadzone gdzie indziej, albo wyraźnie określone. Jeśli parametr szablonu jest używany tylko w kontekstach nieprzebadanych i nie jest jednoznacznie określony , odliczanie argumentów szablonu nie powiedzie się.
5 niepoddanej wywnioskować konteksty są:
(5,5) - parametr funkcyjny, który odliczenie argument nie można tak dlatego, że związane funkcja argument jest funkcja lub zestaw przeciążonych funkcji (13,4), a jeden lub więcej z następujących zastosowanie:
(5.5.1) - więcej niż jedna funkcja dopasowuje parametr funkcja typ (w wyniku dwuznacznej odliczenia)
W drugim przykładzie parametr szablon U
jest stosowany jedynie w ramach nie-wywnioskować, ponieważ obie przeciążenia f(int)
i f(double)
oba mogą być dopasowane do U
. W związku z tym odliczanie argumentów nie ma miejsca, a U
staje się domyślną wartością dostarczoną przez T
(int (*)(int)
w tym przypadku, więc wybrano f(int)
).
Ponadto, jak wyjaśniono przez @VladfromMoscow, posiadanie domyślnego parametru pozwala na skrócenie kodu podczas przekazywania std::exchange<T>
(do standardowego algorytmu np.).
Gah! Mój umysł jest przepalony. Czy to jest nawet legalne? Wygląda na to, że 'f' jest zdefiniowane dwa razy. –
@ JonathanMee Dwa przeciążenia dla 'f' są zadeklarowane. – TartanLlama
@ JonathanMee, podstawowe funkcje przeciążania !? – StoryTeller