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
Definido en el encabezado <type_traits>
template < class T >
struct is_signed ;
(desde C++11)

std::is_signed es un UnaryTypeTrait .

Comprueba si T es un tipo aritmético con signo.

  • Si std:: is_arithmetic < T > :: value es true , proporciona la constante miembro value igual a T ( - 1 ) < T ( 0 ) .
  • En caso contrario, proporciona la constante miembro value igual a false .

Si el programa añade especializaciones para std::is_signed o std::is_signed_v , el comportamiento es indefinido.

Contenidos

Parámetros de plantilla

T - un tipo a verificar

Plantilla de variable auxiliar

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

Heredado de std:: integral_constant

Constantes miembro

value
[static]
true si T es un tipo aritmético con signo, false en caso contrario
(constante miembro pública estática)

Funciones miembro

operator bool
convierte el objeto a bool , devuelve value
(función miembro pública)
operator()
(C++14)
devuelve value
(función miembro pública)

Tipos miembro

Tipo Definición
value_type bool
type std:: integral_constant < bool , value >

Implementación posible

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 {};

Ejemplo

#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()
{
    // la signatura de char está definida por la implementación:
    std::cout << std::boolalpha << std::is_signed_v<char> << '\n';
}

Salida posible:

true

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2197 C++11 value podría ser true incluso si T no es un tipo aritmético solo puede ser false en este caso

Véase también

verifica si un tipo es un tipo aritmético sin signo
(plantilla de clase)
[static]
identifica tipos con signo
(constante miembro estática pública de std::numeric_limits<T> )
verifica si un tipo es un tipo aritmético
(plantilla de clase)
obtiene el tipo con signo correspondiente para el tipo integral dado
(plantilla de clase)
obtiene el tipo sin signo correspondiente para el tipo integral dado
(plantilla de clase)