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
Défini dans l'en-tête <type_traits>
template < class T >
struct is_empty ;
(depuis C++11)

std::is_empty est un UnaryTypeTrait .

Si T est un type vide (c'est-à-dire un type classe non-union sans membres de données non statiques autres que des champs de bits de taille 0, sans fonctions virtuelles, sans classes de base virtuelles et sans classes de base non vides), fournit la constante membre value égale à true . Pour tout autre type, value est false .

Si T est un type de classe non-union incomplet, le comportement est indéfini.

Si le programme ajoute des spécialisations pour std::is_empty ou std::is_empty_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_empty_v = is_empty < T > :: value ;
(depuis C++17)

Hérité de std:: integral_constant

Constantes membres

value
[static]
true si T est un type de classe vide, 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 >

Notes

L'héritage de classes de base vides n'augmente généralement pas la taille d'une classe grâce à l'optimisation des classes de base vides .

std::is_empty<T> et tous les autres traits de type sont des classes vides.

Exemple

#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
}

Sortie possible :

F: 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 publié Comportement corrigé
LWG 2015 C++11 le comportement était indéfini si
T est un type union incomplet
la caractéristique de base est
std::false_type dans ce cas

Voir aussi

(C++11)
vérifie si un type est un type classe non-union
(modèle de classe)