I am trying to profoundly understand Template Argument Deduction.
One point I am not understanding is, how I should apply the rules in the standard
here for the types A and P
for the following case (there is sadly no example on cppreference.com, see below the relevant section)
template<typename T>
void foo(T t);
void call_with_reference(int& r) {
foo(r)
}
P is no reference typ:P := TA := int&-> Match P and A which gives: T is deduced to int&
which is cleary wrong. Where is the rule in the standard that says references from A are removed? A non-confusing, unambiguous clear answer would be very much appreciated.
Relevant Section:

A is the type of an expression. Expression type is described by [expr.type]/1:
If an expression initially has the type “reference to T” ([dcl.ref], [dcl.init.ref]), the type is adjusted to T.
So here A is int.
This expression is an lvalue but that will not play any role since P is not a reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With