Namespaces
Variants

std:: is_empty

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
is_empty
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(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_empty ;
(desde C++11)

std::is_empty es un UnaryTypeTrait .

Si T es un tipo vacío (es decir, un tipo de clase no unión sin miembros de datos no estáticos aparte de campos de bits de tamaño 0, sin funciones virtuales, sin clases base virtuales y sin clases base no vacías), proporciona la constante miembro value igual a true . Para cualquier otro tipo, value es false .

Si T es un tipo de clase no unión incompleto, el comportamiento es indefinido.

Si el programa añade especializaciones para std::is_empty o std::is_empty_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_empty_v = is_empty < T > :: value ;
(desde C++17)

Heredado de std:: integral_constant

Constantes miembro

value
[static]
true si T es un tipo de clase vacío, 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 >

Notas

Heredar de clases base vacías generalmente no aumenta el tamaño de una clase debido a la optimización de base vacía .

std::is_empty<T> y todos los demás rasgos de tipo son clases vacías.

Ejemplo

#include <iostream>
#include <type_traits>
struct A {};
static_assert(std::is_empty_v<A> == true);
struct B { int m; };
static_assert(std::is_empty_v<B> == false);
struct C { static int m; };
static_assert(std::is_empty_v<C> == true);
struct D { virtual ~D(); };
static_assert(std::is_empty_v<D> == false);
union E {};
static_assert(std::is_empty_v<E> == false);
struct F { [[no_unique_address]] E e; };
struct G
{
    int:0;
    // C++ standard allow "as a special case, an unnamed bit-field with a width of zero
    // specifies alignment of the next bit-field at an allocation unit boundary.
    // Only when declaring an unnamed bit-field may the width be zero."
};
static_assert(std::is_empty_v<G>); // holds only unnamed bit-fields of zero width
int main()
{
    std::cout << std::boolalpha;
    std::cout << "F: " << std::is_empty_v<F> << '\n'; // the result is ABI-dependent
}

Salida posible:

F: 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 2015 C++11 el comportamiento era indefinido si
T es un tipo unión incompleto
la característica base es
std::false_type en este caso

Véase también

(C++11)
comprueba si un tipo es un tipo de clase no-union
(plantilla de clase)