Ihre Template-Funktion (das heißt, f
) als Parameter eine forwarding reference (a.k.a universelle Referenz). Die Regeln, die den Abzug von T
bestimmen, werden als reference collapsing rules bezeichnet.Diese Regeln sind unten zusammengefasst:
T&
&
wird T&
T&
&&
wird T&
T&&
&
wird T&
T&&
&&
T&&
wird
nun nach dem Referenzregeln kollabiert, wenn Sie als Parameter f
int const i
liefern, wird T
-int const&
abgezogen.
Nach der C++ Standardtabelle 52 is_const
würde true
bewerten, wenn T
const
qualifizierte ist.
Weiterhin ist in der C++ Standard §20.13.4.3/p5 Typ Eigenschaften [meta.unary.prop] gibt es das folgende Beispiel, wie is_const
Typ Merkmal funktioniert:
[ Beispiel:
is_const<const volatile int>::value // true
is_const<const int*>::value // false
is_const<const int&>::value // false
is_const<int[3]>::value // false
is_const<const int[3]>::value // true
- Ende Beispiel]
Wie Sie in der dritten Zeile sehen können, ist unser Fall is_const
wertet false
aus. Warum? Da der Typ, der als Vorlageparameter an is_const
übergeben wird, ein Referenztyp ist. Nun, Referenzen sind inhärent const
in dem Sinne, dass Sie nicht ändern können, worauf sie sich beziehen, aber sie sind nicht const
qualifiziert. Somit wird is_const
mit einem Referenztyp zu false
ausgewertet.
@ 101010 Die Verwendung ist korrekt. ['is_const'] (http://en.cppreference.com/w/cpp/types/is_const) hat einen geeigneten Konvertierungsoperator. – juanchopanza
@juanchopanza Dank für die Info, die ich nicht wusste. – 101010
@juanchopanza was in 'cout <() << endl;' würde es zwingen zu boolen? –
xaxxon