Namensräume
Varianten
Aktionen

std::is_empty

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
is_empty
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
Definiert in der Kopfdatei <type_traits>
template< class T >
struct is_empty;
(seit C++11)

std::is_empty ist ein UnaryTypeTrait.

Wenn T ein leerer Typ ist (d. h. ein nicht-union-Klassentyp ohne nicht-statische Datenmember außer Bitfeldern der Größe 0, ohne virtuelle Funktionen, ohne virtuelle Basisklassen und ohne nicht-leere Basisklassen), stellt er die Member-Konstante value gleich true bereit. Für jeden anderen Typ ist value false.

Wenn T ein unvollständiger nicht-union-Klassentyp ist, ist das Verhalten undefiniert.

Wenn das Programm Spezialisierungen für std::is_empty oder std::is_empty_v hinzufügt, ist das Verhalten undefiniert.

Inhalt

[bearbeiten] Template-Parameter

T - ein zu prüfender Typ

[bearbeiten] Hilfsvariablen-Template

template< class T >
constexpr bool is_empty_v = is_empty<T>::value;
(seit C++17)

Abgeleitet von std::integral_constant

Member-Konstanten

value
[static]
true wenn T ein leerer Klassentyp ist, false andernfalls
(öffentliche statische Member-Konstante)

Memberfunktionen

operator bool
konvertiert das Objekt zu bool, gibt value zurück
(öffentliche Memberfunktion)
operator()
(C++14)
gibt value zurück
(öffentliche Memberfunktion)

Membertypen

Typ Definition
value_type bool
type std::integral_constant<bool, value>

[bearbeiten] Hinweise

Das Erben von leeren Basisklassen erhöht die Größe einer Klasse normalerweise nicht aufgrund der Empty Base Optimization.

std::is_empty<T> und alle anderen Typ-Traits sind leere Klassen.

[bearbeiten] Beispiel

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

Mögliche Ausgabe

F: true

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2015 C++11 Das Verhalten war undefiniert, wenn
T ein unvollständiger Union-Typ war
Die Basischarakteristik ist
std::false_type in diesem Fall

[bearbeiten] Siehe auch

(C++11)
prüft, ob ein Typ ein Nicht-Union-Klassentyp ist
(Klassenvorlage) [bearbeiten]