Namespaces
Variants

std:: is_signed

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
is_signed
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Défini dans l'en-tête <type_traits>
template < class T >
struct is_signed ;
(depuis C++11)

std::is_signed est un UnaryTypeTrait .

Vérifie si T est un type arithmétique signé.

  • Si std:: is_arithmetic < T > :: value est true , fournit la constante membre value égale à T ( - 1 ) < T ( 0 ) .
  • Sinon, fournit la constante membre value égale à false .

Si le programme ajoute des spécialisations pour std::is_signed ou std::is_signed_v , le comportement est indéfini.

Table des matières

Paramètres du modèle

T - un type à vérifier

Modèle de variable d'assistance

template < class T >
constexpr bool is_signed_v = is_signed < T > :: value ;
(depuis C++17)

Hérité de std:: integral_constant

Constantes membres

value
[static]
true si T est un type arithmétique signé, false sinon
(constante membre publique statique)

Fonctions membres

operator bool
convertit l'objet en bool , retourne value
(fonction membre publique)
operator()
(C++14)
retourne value
(fonction membre publique)

Types membres

Type Définition
value_type bool
type std:: integral_constant < bool , value >

Implémentation possible

namespace detail
{
    template<typename T, bool = std::is_arithmetic<T>::value>
    struct is_signed : std::integral_constant<bool, T(-1) < T(0)> {};
    template<typename T>
    struct is_signed<T, false> : std::false_type {};
}
template<typename T>
struct is_signed : detail::is_signed<T>::type {};

Exemple

#include <iostream>
#include <type_traits>
class A {};
static_assert(std::is_signed_v<A> == false);
class B { int i; };
static_assert(std::is_signed_v<B> == false);
enum C : int {};
static_assert(std::is_signed_v<C> == false);
enum class D : int {};
static_assert(std::is_signed_v<D> == false);
static_assert
(
    std::is_signed<signed int>::value == true and // C++11
    std::is_signed<signed int>() == true and      // C++11
    std::is_signed<signed int>{} == true and      // C++11
    std::is_signed_v<signed int> == true and      // C++17
    std::is_signed_v<unsigned int> == false and
    std::is_signed_v<float> == true and
    std::is_signed_v<bool> == false and
    std::is_signed_v<signed char> == true and
    std::is_signed_v<unsigned char> == false
);
int main()
{
    // signedness of char is implementation-defined:
    std::cout << std::boolalpha << std::is_signed_v<char> << '\n';
}

Sortie possible :

true

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement tel que publié Comportement corrigé
LWG 2197 C++11 value pouvait être true même si T n'est pas un type arithmétique ne peut être que false dans ce cas

Voir aussi

vérifie si un type est un type arithmétique non signé
(modèle de classe)
[static]
identifie les types signés
(constante membre statique publique de std::numeric_limits<T> )
vérifie si un type est un type arithmétique
(modèle de classe)
obtient le type signé correspondant pour le type intégral donné
(modèle de classe)
obtient le type non signé correspondant pour le type intégral donné
(modèle de classe)