Pour le code suivant, toutes les assertions sauf la dernière passent:
template<typename T>
constexpr void assert_static_cast_identity() {
using T_cast = decltype(static_cast<T>(std::declval<T>()));
static_assert(std::is_same_v<T_cast, T>);
}
int main() {
assert_static_cast_identity<int>();
assert_static_cast_identity<int&>();
assert_static_cast_identity<int&&>();
// assert_static_cast_identity<int(int)>(); // illegal cast
assert_static_cast_identity<int (&)(int)>();
assert_static_cast_identity<int (&&)(int)>(); // static assert fails
}
Pourquoi cette dernière assertion échoue-t-elle et static_cast<T>
ne renvoie- T
t- elle pas toujours un ?
c++
static-cast
Eric
la source
la source
T_cast i{1};
je reçoisinvalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>'
, donc pour une raison quelconque,T_cast
c'est unint (&)(int)
plutôt qu'unint (&&)(int)
.Réponses:
Ceci est codé en dur dans la définition de
static_cast
:decltype
respecte la catégorie de valeur de son opérande et produit une référence lvalue pour les expressions lvalue.Le raisonnement peut être dû au fait que les noms de fonctions eux-mêmes sont toujours des valeurs l, et donc une valeur r d'un type de fonction ne peut pas apparaître "à l'état sauvage". En tant que tel, le casting sur ce type n'a probablement aucun sens.
la source