Namensräume
Varianten
Aktionen

explicit-Spezifizierer

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Inhalt

[bearbeiten] Syntax

explicit (1)
explicit ( Ausdruck ) (2) (seit C++20)
expression - kontextuell konvertierbarer konstanter Ausdruck vom Typ bool


1) Gibt an, dass ein Konstruktor oder eine Konvertierungsfunktion(seit C++11)oder eine Deduktionshilfe(seit C++17) explizit ist, d.h. er kann nicht für implizite Konvertierungen und Kopierinitialisierungen verwendet werden.
2) Der Spezifizierer explicit kann mit einem konstanten Ausdruck verwendet werden. Die Funktion ist genau dann explizit, wenn dieser konstante Ausdruck zu true ausgewertet wird.
(seit C++20)

Der Spezifizierer explicit darf nur innerhalb der Deklarationsspezifizierer-Sequenz der Deklaration eines Konstruktors oder einer Konvertierungsfunktion(seit C++11) innerhalb ihrer Klassendefinition erscheinen.

[bearbeiten] Anmerkungen

Ein Konstruktor mit einem einzigen nicht standardmäßig initialisierten Parameter(bis C++11), der ohne den Funktionsspezifizierer explicit deklariert wird, wird als Konvertierungskonstruktor bezeichnet.

Sowohl Konstruktoren (außer Kopier-/Verschiebungskonstruktoren) als auch benutzerdefinierte Konvertierungsfunktionen können Funktionstemplates sein; die Bedeutung von explicit ändert sich nicht.

Ein (-Token, das auf explicit folgt, wird immer als Teil des expliziten Spezifizierers interpretiert.

struct S
{
    explicit (S)(const S&);    // error in C++20, OK in C++17
    explicit (operator int)(); // error in C++20, OK in C++17
};
(seit C++20)
Feature-Testmakro Wert Std Feature
__cpp_conditional_explicit 201806L (C++20) bedingtes explicit

[bearbeiten] Schlüsselwörter

explicit

[bearbeiten] Beispiel

struct A
{
    A(int) {}      // converting constructor
    A(int, int) {} // converting constructor (C++11)
    operator bool() const { return true; }
};
 
struct B
{
    explicit B(int) {}
    explicit B(int, int) {}
    explicit operator bool() const { return true; }
};
 
int main()
{
    A a1 = 1;      // OK: copy-initialization selects A::A(int)
    A a2(2);       // OK: direct-initialization selects A::A(int)
    A a3 {4, 5};   // OK: direct-list-initialization selects A::A(int, int)
    A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int)
    A a5 = (A)1;   // OK: explicit cast performs static_cast
    if (a1) { }    // OK: A::operator bool()
    bool na1 = a1; // OK: copy-initialization selects A::operator bool()
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization
 
//  B b1 = 1;      // error: copy-initialization does not consider B::B(int)
    B b2(2);       // OK: direct-initialization selects B::B(int)
    B b3 {4, 5};   // OK: direct-list-initialization selects B::B(int, int)
//  B b4 = {4, 5}; // error: copy-list-initialization does not consider B::B(int, int)
    B b5 = (B)1;   // OK: explicit cast performs static_cast
    if (b2) { }    // OK: B::operator bool()
//  bool nb1 = b2; // error: copy-initialization does not consider B::operator bool()
    bool nb2 = static_cast<bool>(b2); // OK: static_cast performs direct-initialization
 
    [](...){}(a4, a5, na1, na2, b5, nb2); // suppresses “unused variable” warnings
}

[bearbeiten] Siehe auch