Namespaces
Variants

Member access operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Greift auf ein Mitglied seines Operanden zu.

Operatorname Syntax Über lade bar Prototypbeispiele (für class T )
Innerhalb der Klassendefinition Außerhalb der Klassendefinition
Indexoperator a [ b ] Ja R & T :: operator [ ] ( S b ) ; N/A
a [ ... ] (seit C++23) R & T :: operator [ ] ( ... ) ;
Dereferenzierung * a Ja R & T :: operator * ( ) ; R & operator * ( T a ) ;
Adressoperator & a Ja R * T :: operator & ( ) ; R * operator & ( T a ) ;
Elementzugriff (Objekt) a. b Nein N/A N/A
Elementzugriff (Zeiger) a - > b Ja R * T :: operator - > ( ) ; N/A
Zeiger-auf-Element (Objekt) a. * b Nein N/A N/A
Zeiger-auf-Element (Zeiger) a - > * b Ja R & T :: operator - > * ( S b ) ; R & operator - > * ( T a, S b ) ;
Anmerkungen
  • Wie bei den meisten benutzerdefinierten Überladungen sollten die Rückgabetypen mit denen der eingebauten Operatoren übereinstimmen, damit die benutzerdefinierten Operatoren auf die gleiche Weise wie die eingebauten verwendet werden können. Allerdings kann bei einer benutzerdefinierten Operatorüberladung jeder Typ als Rückgabetyp verwendet werden (einschließlich void ). Eine Ausnahme ist operator - > , der einen Zeiger oder eine andere Klasse mit überladenem operator - > zurückgeben muss, um praktisch nutzbar zu sein.

Inhaltsverzeichnis

Erklärung

Der eingebaute Subscript-Operator ermöglicht den Zugriff auf ein Objekt, auf das der Pointer - oder Array -Operand zeigt.

Der eingebaute Indirektionsoperator ermöglicht den Zugriff auf ein Objekt oder eine Funktion, auf die der Zeigeroperand zeigt.

Der eingebaute address-of Operator erzeugt einen Zeiger, der auf das Objekt oder die Funktion des Operanden zeigt.

Member of object und pointer to member of object Operatoren ermöglichen den Zugriff auf ein Datenelement oder eine Memberfunktion des Objektoperanden.

Eingebaute Zeiger-auf-Mitglied und Zeiger-auf-Mitglied-eines-Zeigers Operatoren ermöglichen den Zugriff auf ein Datenelement oder eine Memberfunktion der Klasse, auf die der Zeigeroperand zeigt.

Eingebauter Subskript-Operator

Die Indexoperatorausdrücke haben die Form

expr1  [ expr2  ] (1)
expr1  [{ expr  , ... }] (2) (seit C++11)
expr1  [ expr2  , expr  , ... ] (3) (seit C++23)
1) Für den eingebauten Operator muss einer der Ausdrücke (entweder expr1 oder expr2 ) ein Glvalue vom Typ "Array von T " oder ein Prvalue vom Typ "Zeiger auf T " sein, während der andere Ausdruck ( expr2 oder expr1 , entsprechend) ein Prvalue von unscoped Enumeration oder integralem Typ sein muss. Das Ergebnis dieses Ausdrucks hat den Typ T . expr2 darf kein ungeklammerter Komma-Ausdruck sein. (seit C++23)
2) Die Form mit der in geschweiften Klammern eingeschlossenen Liste innerhalb der eckigen Klammern wird nur verwendet, um einen überladenen operator [ ] aufzurufen.
3) Die Form mit durch Kommas getrennten Ausdruckslisten innerhalb der eckigen Klammern wird nur verwendet, um einen überladenen operator [ ] aufzurufen.

Der eingebaute Indexausdruck E1 [ E2 ] ist exakt identisch mit dem Ausdruck * ( E1 + E2 ) abgesehen von seiner Wertkategorie (siehe unten) und der Auswertungsreihenfolge (seit C++17) : Der Zeigeroperand (der das Ergebnis einer Array-zu-Zeiger-Konvertierung sein kann und auf ein Element eines Arrays oder auf das Element nach dem Ende zeigen muss) wird angepasst, um auf ein anderes Element desselben Arrays zu zeigen, gemäß den Regeln der Zeigerarithmetik , und wird dann dereferenziert.

Wenn auf ein Array angewendet, ist der Indexausdruck ein lvalue wenn das Array ein lvalue ist, und ein xvalue wenn es keiner ist (since C++11) .

Wenn auf einen Zeiger angewendet, ist der Subskriptausdruck immer ein Lvalue.

Der Typ T darf kein unvollständiger Typ sein, selbst wenn die Größe oder interne Struktur von T niemals verwendet wird, wie in & x [ 0 ] .

Die Verwendung eines nicht in Klammern gesetzten Komma-Ausdrucks als zweites (rechtes) Argument eines Subskript-Operators ist veraltet.

Beispielsweise ist a [ b, c ] veraltet, während a [ ( b, c ) ] nicht veraltet ist.

(seit C++20)
(bis C++23)

Ein nicht in Klammern gesetzter Komma-Ausdruck kann nicht als zweites (rechtes) Argument eines Subskript-Operators verwendet werden. Beispielsweise ist a [ b, c ] entweder fehlerhaft oder äquivalent zu a. operator [ ] ( b, c ) .

Klammern sind erforderlich, um einen Komma-Ausdruck als Subskript zu verwenden, z.B. a [ ( b, c ) ] .

(seit C++23)

Bei Überladungsauflösung für benutzerdefinierte Operatoren nimmt für jeden Objekttyp T (möglicherweise cv-qualifiziert) die folgende Funktionssignatur an der Überladungsauflösung teil:

T & operator [ ] ( T * , std:: ptrdiff_t ) ;
T & operator [ ] ( std:: ptrdiff_t , T * ) ;
**Anmerkung:** Da der gesamte Inhalt innerhalb von ` ` Tags liegt (was als Code-ähnlicher Bereich behandelt werden sollte) und spezifische C++-Begriffe enthält, wurde gemäß den Anweisungen keine Übersetzung vorgenommen. Die HTML-Struktur und Formatierung bleiben vollständig erhalten.
#include <iostream>
#include <map>
#include <string>
int main()
{
    int a[4] = {1, 2, 3, 4};
    int* p = &a[2];
    std::cout << p[1] << p[-1] << 1[p] << (-1)[p] << '\n';
    std::map<std::pair<int, int>, std::string> m;
    m[{1, 2}] = "abc"; // verwendet die [{...}] Version
}

Ausgabe:

4242

Eingebauter Indirektionsoperator

Die Dereferenzierungsoperator-Ausdrücke haben die Form

* Ausdruck

Der Operand des eingebauten Dereferenzierungsoperators muss ein Zeiger auf ein Objekt oder ein Zeiger auf eine Funktion sein, und das Ergebnis ist der Lvalue, der sich auf das Objekt oder die Funktion bezieht, auf die expr zeigt. Wenn expr nicht tatsächlich auf ein Objekt oder eine Funktion zeigt, ist das Verhalten undefiniert (mit Ausnahme des durch typeid spezifizierten Falls).

Ein Zeiger auf (möglicherweise cv -qualifizierten) void kann nicht dereferenziert werden. Zeiger auf andere unvollständige Typen können dereferenziert werden, aber der resultierende L-Wert kann nur in Kontexten verwendet werden, die einen L-Wert eines unvollständigen Typs erlauben, z.B. bei der Initialisierung einer Referenz.

Bei Überlagerungsauflösung für benutzerdefinierte Operatoren nimmt für jeden Typ T , der entweder ein Objekttyp (möglicherweise cv-qualifiziert) oder ein Funktionstyp (nicht const- oder ref-qualifiziert) ist, die folgende Funktionssignatur an der Überlagerungsauflösung teil:

T & operator * ( T * ) ;
#include <iostream>
int f() { return 42; }
int main()
{
    int n = 1;
    int* pn = &n;
    int& r = *pn; // Lvalue kann an eine Referenz gebunden werden
    int m = *pn;  // Indirektion + Lvalue-zu-Rvalue-Konvertierung
    int (*fp)() = &f;
    int (&fr)() = *fp; // Funktions-Lvalue kann an eine Referenz gebunden werden
    [](...){}(r, m, fr); // entfernt mögliche "unbenutzte Variable"-Warnungen
}

Eingebauter Adressoperator

Die Adressoperator-Ausdrücke haben die Form

& expr (1)
& class  :: member (2)
1) Wenn der Operand ein Lvalue-Ausdruck eines Objekt- oder Funktionstyps T ist, operator& erzeugt und liefert einen Prvalue vom Typ T* mit derselben CV-Qualifikation, der auf das durch den Operanden bezeichnete Objekt oder die Funktion zeigt. Wenn der Operand einen unvollständigen Typ hat, kann der Zeiger gebildet werden, aber falls dieser unvollständige Typ zufällig eine Klasse ist, die ihren eigenen operator & definiert, ist es nicht spezifiziert, ob der eingebaute oder der überladene Operator verwendet wird. Für Operanden von Typen mit benutzerdefiniertem operator & kann std::addressof verwendet werden, um den echten Zeiger zu erhalten. Zu beachten ist, dass es im Gegensatz zu C99 und späteren C-Versionen keinen Sonderfall für den unären operator & gibt, der auf das Ergebnis des unären operator * angewendet wird.
Wenn der Operand der Name einer überladenen Funktion ist, kann die Adresse nur dann genommen werden, wenn die Überladung aufgrund des Kontexts aufgelöst werden kann. Siehe Adresse einer überladenen Funktion für Details.

Wenn expr eine explizite Objekt-Memberfunktion benennt, muss expr ein qualifizierter Bezeichner sein. Die Anwendung von & auf einen unqualifizierten Bezeichner, der eine explizite Objekt-Memberfunktion benennt, ist fehlerhaft.

(since C++23)
2) Wenn der Operand ein qualifizierter Name eines nicht-statischen oder Variant -Members außer einer expliziten Objekt-Memberfunktion (seit C++23) ist, z.B. & C :: member , dann ist das Ergebnis ein PRvalue Zeiger auf Memberfunktion oder Zeiger auf Datenelement vom Typ T in der Klasse C . Beachten Sie, dass weder & member noch C :: member noch sogar & ( C :: member ) zur Initialisierung eines Zeigers auf Member verwendet werden können.

Bei Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren führt dieser Operator keine zusätzlichen Funktionssignaturen ein: Der eingebaute Adressoperator kommt nicht zur Anwendung, falls eine überladene operator & existiert, die eine geeignete Funktion darstellt.

void f(int) {}
void f(double) {}
struct A { int i; };
struct B { void f(); };
int main()
{
    int n = 1;
    int* pn = &n;    // Zeiger
    int* pn2 = &*pn; // pn2 == pn
    int A::* mp = &A::i;      // Zeiger auf Datenelement
    void (B::*mpf)() = &B::f; // Zeiger auf Memberfunktion
    void (*pf)(int) = &f; // Überladungsauflösung durch Initialisierungskontext
//  auto pf2 = &f; // Fehler: mehrdeutiger überladener Funktionstyp
    auto pf2 = static_cast<void (*)(int)>(&f); // Überladungsauflösung durch Cast
}

Eingebaute Member-Zugriffsoperatoren

Die Memberzugriffsoperatorausdrücke haben die Form

expr  .template (optional) id-expr (1)
expr  ->template (optional) id-expr (2)
expr  . Pseudo-Destruktor (3)
expr  -> Pseudo-Destruktor (4)
1) Der expr muss ein Ausdruck vom Typ einer vollständigen Klasse T sein.
Falls id-expr einen static member oder enumerator benennt, ist expr ein discarded-value expression .
2) Der expr muss ein Ausdruck vom Typ Zeiger auf einen vollständigen Klassentyp T* sein.
3,4) Der expr muss ein Ausdruck skalaren Typs sein (siehe unten).

id-expr ist ein Name (formal ein Identifikatorausdruck , der benennt) eines Datenelements oder einer Memberfunktion von T oder einer eindeutigen und zugänglichen Basisklasse B von T (z.B. E1. E2 oder E1 - > E2 ), optional qualifiziert (z.B. E1. B :: E2 oder E1 - > B :: E2 ), optional unter Verwendung des template Disambiguators (z.B. E1. template E2 oder E1 - > template E2 ).

Wenn ein benutzerdefinierter operator - > aufgerufen wird, wird operator - > rekursiv erneut auf den resultierenden Wert angewendet, bis ein operator - > erreicht wird, der einen einfachen Zeiger zurückgibt. Danach werden die integrierten Semantiken auf diesen Zeiger angewendet.

Der Ausdruck E1 - > E2 ist exakt äquivalent zu ( * E1 ) . E2 für eingebaute Typen; deshalb behandeln die folgenden Regeln nur E1. E2 .

Im Ausdruck E1. E2 :

1) Wenn E2 ein static data member ist:
  • Wenn E2 vom Referenztyp T& oder T&& (since C++11) ist, ist das Ergebnis ein L-Wert vom Typ T , der das Objekt oder die Funktion bezeichnet, an die die Referenz gebunden ist.
  • Andernfalls, bei gegebenem Typ von E2 als T , ist das Ergebnis ein L-Wert vom Typ T , der diesen static data member bezeichnet.
Im Wesentlichen wird E1 in beiden Fällen ausgewertet und verworfen.
2) Wenn E2 ein nicht-statisches Datenelement ist:
  • Wenn E2 vom Referenztyp T& oder T&& (seit C++11) ist, dann ist das Ergebnis ein Lvalue vom Typ T , der das Objekt oder die Funktion bezeichnet, an die das entsprechende Referenzmitglied von E1 gebunden ist.
  • Andernfalls, wenn E1 ein Lvalue ist, dann ist das Ergebnis ein Lvalue, der dieses nicht-statische Datenelement von E1 bezeichnet.
  • Andernfalls (wenn E1 ein Rvalue (bis C++17) Xvalue (der aus einem Prvalue materialisiert werden kann) (seit C++17) ist), dann ist das Ergebnis ein Rvalue (bis C++11) Xvalue (seit C++11) , der dieses nicht-statische Datenelement von E1 bezeichnet.
Wenn E2 kein mutable -Member ist, dann ist die CV-Qualifikation des Ergebnisses die Vereinigung der CV-Qualifikationen von E1 und E2 , andernfalls (wenn E2 ein mutable Member ist), ist es die Vereinigung der volatile-Qualifikationen von E1 und E2 .
3) Falls E2 ein Überladungssatz (von einer oder mehreren statischen Memberfunktionen und nicht-statischen Memberfunktionen ) ist, E1. E2 muss der (möglicherweise in Klammern gesetzte) linke Operand eines Memberfunktionsaufrufoperators sein, und Funktionsüberladungsauflösung wird verwendet, um die Funktion auszuwählen, auf die E2 verweist, danach:
  • Falls E2 eine statische Memberfunktion ist, ist das Ergebnis ein L-Wert, der diese statische Memberfunktion bezeichnet. Im Wesentlichen wird E1 in diesem Fall ausgewertet und verworfen.
  • Andernfalls ( E2 ist eine nicht-statische Memberfunktion ), ist das Ergebnis ein PR-Wert, der diese nicht-statische Memberfunktion von E1 bezeichnet.
4) Wenn E2 ein Mitgliedsenumerator ist, ergibt sich bei gegebenem Typ E2 als T das Ergebnis als ein R-Wert (bis C++11) ein PR-Wert (seit C++11) vom Typ T , dessen Wert dem Wert des Enumerators entspricht.
5) Wenn E2 ein geschachtelter Typ ist, ist das Programm fehlerhaft.
6) Wenn E1 einen ScalarType hat und E2 eine ~ gefolgt vom Typnamen oder decltype-Spezifizierer ist, der denselben Typ (ohne CV-Qualifizierungen) bezeichnet, optional qualifiziert , dann ist das Ergebnis eine spezielle Art von Prvalue, die nur als linkoperand eines Funktionsaufrufoperators verwendet werden kann und für keinen anderen Zweck
Der resultierende Funktionsaufrufausdruck wird als Pseudo-Destruktoraufruf bezeichnet. Er nimmt keine Argumente entgegen, gibt void zurück, wertet E1 aus und beendet die Lebensdauer seines Ergebnisobjekts. Dies ist der einzige Fall, bei dem der linke Operand von operator. einen Nicht-Klassentyp hat. Die Zulassung von Pseudo-Destruktoraufrufen ermöglicht es, Code zu schreiben, ohne wissen zu müssen, ob für einen gegebenen Typ ein Destruktor existiert.

operator. kann nicht überladen werden, und für operator - > führt bei der Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren der eingebaute Operator keine zusätzlichen Funktionssignaturen ein: Der eingebaute operator - > kommt nicht zur Anwendung, wenn eine überladene operator - > existiert, die eine geeignete Funktion ist.

#include <cassert>
#include <iostream>
#include <memory>
struct P
{
    template<typename T>
    static T* ptr() { return new T; }
};
template<typename T>
struct A
{
    A(int n): n(n) {}
    int n;
    static int sn;
    int f() { return 10 + n; }
    static int sf() { return 4; }
    class B {};
    enum E {RED = 1, BLUE = 2};
    void g()
    {
        typedef int U;
        // keyword template needed for a dependent template member
        int* p = T().template ptr<U>();
        p->~U(); // U is int, calls int's pseudo destructor
        delete p;
    }
};
template<>
int A<P>::sn = 2;
struct UPtrWrapper
{
    std::unique_ptr<std::string> uPtr;
    std::unique_ptr<std::string>& operator->() { return uPtr; }
};
int main()
{
    A<P> a(1);
    std::cout << a.n << ' '
              << a.sn << ' '   // A::sn also works
              << a.f() << ' ' 
              << a.sf() << ' ' // A::sf() also works
//            << &a.f << ' '   // error: ill-formed if a.f is not the
                               // left-hand operand of operator()
//            << a.B << ' '    // error: nested type not allowed
              << a.RED << ' '; // enumerator
    UPtrWrapper uPtrWrap{std::make_unique<std::string>("wrapped")};
    assert(uPtrWrap->data() == uPtrWrap.operator->().operator->()->data());
}

Ausgabe:

1 2 11 4 1

Wenn E2 ein nicht-statisches Mitglied ist und das Ergebnis von E1 ein Objekt ist, dessen Typ nicht ähnlich zum Typ von E1 ist, ist das Verhalten undefiniert:

struct A { int i; };
struct B { int j; };
struct D : A, B {};
void f()
{
    D d;
    static_cast<B&>(d).j;      // OK, Objektausdruck bezeichnet das B-Subobjekt von d
    reinterpret_cast<B&>(d).j; // undefiniertes Verhalten
}

Eingebaute Zeiger-auf-Member-Zugriffsoperatoren

Die Ausdrücke für den Elementzugriffsoperator über Zeiger auf Elemente haben die Form

lhs  .* rhs (1)
lhs  ->* rhs (2)
1) lhs muss ein Ausdruck vom Klassentyp T sein.
2) lhs muss ein Ausdruck vom Typ Zeiger auf Klassentyp T* sein.

rhs muss ein Rvalue vom Typ Zeiger auf Element ( Daten oder Funktion ) von T oder Zeiger auf Element einer eindeutigen und zugänglichen Basisklasse B von T sein.

Der Ausdruck E1 - > * E2 ist exakt äquivalent zu ( * E1 ) . * E2 für eingebaute Typen; deshalb behandeln die folgenden Regeln nur E1. * E2 .

Im Ausdruck E1. * E2 :

1) falls E2 ein Zeiger auf ein Datenelement ist,
  • falls E1 ein Lvalue ist, ist das Ergebnis ein Lvalue, das dieses Datenelement bezeichnet,
  • andernfalls (falls E1 ein Rvalue (bis C++17) Xvalue (der aus einem Prvalue materialisiert werden kann) (seit C++17) ist), ist das Ergebnis ein Rvalue (bis C++11) Xvalue (seit C++11) , der dieses Datenelement bezeichnet;
2) wenn E2 ein Zeiger auf eine Memberfunktion ist, dann ist das Ergebnis eine spezielle Art von Prvalue, die diese Memberfunktion bezeichnet und nur als linker Operand des Memberfunktionsaufrufoperators verwendet werden kann, und für keinen anderen Zweck;
3) Die CV-Qualifikationsregeln sind dieselben wie für den Member-of-Object-Operator, mit einer zusätzlichen Regel: Ein Zeiger auf Member, der auf ein veränderliches Member verweist, kann nicht verwendet werden, um dieses Member in einem const-Objekt zu modifizieren;
4) wenn E2 ein Null-Zeiger-auf-Mitglied-Wert ist, ist das Verhalten undefiniert;
5) wenn das Ergebnis E1 ein Objekt ist, dessen Typ nicht ähnlich zum Typ von E1 ist, oder dessen abgeleitetstes Objekt das Mitglied, auf das E2 verweist, nicht enthält, ist das Verhalten undefiniert;
6) wenn E1 ein Rvalue ist und E2 auf eine Memberfunktion mit Ref-Qualifier & zeigt, ist das Programm ill-formed es sei denn, die Memberfunktion hat den CV-Qualifier const aber nicht volatile (seit C++20) ;
7) wenn E1 ein L-Wert ist und E2 auf eine Elementfunktion mit Ref-Qualifier && zeigt, ist das Programm fehlerhaft.
(since C++11)

Bei Überlagerungsauflösung gegenüber benutzerdefinierten Operatoren nimmt für jede Kombination von Typen D , B , R , wobei der Klassentyp B entweder dieselbe Klasse wie D oder eine eindeutige und zugängliche Basisklasse von D ist, und R entweder ein Objekt- oder Funktionstyp ist, die folgende Funktionssignatur an der Überlagerungsauflösung teil:

R & operator - > * ( D * , R B :: * ) ;

wobei beide Operanden cv-qualifiziert sein können, in welchem Fall die cv-Qualifikation des Rückgabetyps die Vereinigung der cv-Qualifikation der Operanden ist.

#include <iostream>
struct S
{
    S(int n) : mi(n) {}
    mutable int mi;
    int f(int n) { return mi + n; }
};
struct D : public S
{
    D(int n) : S(n) {}
};
int main()
{
    int S::* pmi = &S::mi;
    int (S::* pf)(int) = &S::f;
    const S s(7);
//  s.*pmi = 10; // error: cannot modify through mutable
    std::cout << s.*pmi << '\n';
    D d(7); // base pointers work with derived object
    D* pd = &d;
    std::cout << (d.*pf)(7) << ' '
              << (pd->*pf)(8) << '\n';
}

Ausgabe:

7
14 15
**Übersetzungsdetails:** - "Run this code" → "Diesen Code ausführen" - "Output:" → "Ausgabe:" - HTML-Tags, Attribute und Code-Bereiche wurden unverändert beibehalten - C++-spezifische Begriffe wurden nicht übersetzt - Formatierung und Struktur wurden originalgetreu erhalten

Standardbibliothek

Der Subscript-Operator wird von vielen Standard-Containerklassen überladen:

greift auf spezifisches Bit zu
(öffentliche Elementfunktion von std::bitset<N> )
bietet indizierten Zugriff auf das verwaltete Array
(öffentliche Elementfunktion von std::unique_ptr<T,Deleter> )
greift auf das spezifizierte Zeichen zu
(öffentliche Elementfunktion von std::basic_string<CharT,Traits,Allocator> )
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion von std::array<T,N> )
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion von std::deque<T,Allocator> )
greift auf spezifiziertes Element zu
(öffentliche Elementfunktion von std::vector<T,Allocator> )
greift auf spezifiziertes Element zu oder fügt es ein
(öffentliche Elementfunktion von std::map<Key,T,Compare,Allocator> )
greift auf spezifiziertes Element zu oder fügt es ein
(öffentliche Elementfunktion von std::unordered_map<Key,T,Hash,KeyEqual,Allocator> )
greift auf ein Element per Index zu
(öffentliche Elementfunktion von std::reverse_iterator<Iter> )
greift auf ein Element per Index zu
(öffentliche Elementfunktion von std::move_iterator<Iter> )
ruft Valarray-Element, -Slice oder -Maske ab/legt es fest
(öffentliche Elementfunktion von std::valarray<T> )
gibt spezifizierten Sub-Match zurück
(öffentliche Elementfunktion von std::match_results<BidirIt,Alloc> )

Der Indirektions- und Mitgliedsoperator wird von vielen Iteratoren und Smart-Pointer-Klassen überladen:

dereferenziert den Zeiger auf das verwaltete Objekt
(öffentliche Elementfunktion von std::unique_ptr<T,Deleter> )
dereferenziert den gespeicherten Zeiger
(öffentliche Elementfunktion von std::shared_ptr<T> )
greift auf das verwaltete Objekt zu
(öffentliche Elementfunktion von std::auto_ptr<T> )
dereferenziert den Iterator
(öffentliche Elementfunktion von std::raw_storage_iterator<OutputIt,T> )
dereferenziert den dekrementierten zugrundeliegenden Iterator
(öffentliche Elementfunktion von std::reverse_iterator<Iter> )
No-Op
(öffentliche Elementfunktion von std::back_insert_iterator<Container> )
No-Op
(öffentliche Elementfunktion von std::front_insert_iterator<Container> )
No-Op
(öffentliche Elementfunktion von std::insert_iterator<Container> )
greift auf das referenzierte Element zu
(öffentliche Elementfunktion von std::move_iterator<Iter> )
gibt das aktuelle Element zurück
(öffentliche Elementfunktion von std::istream_iterator<T,CharT,Traits,Distance> )
No-Op
(öffentliche Elementfunktion von std::ostream_iterator<T,CharT,Traits> )
erhält eine Kopie des aktuellen Zeichens
(öffentliche Elementfunktion von std::istreambuf_iterator<CharT,Traits> )
No-Op
(öffentliche Elementfunktion von std::ostreambuf_iterator<CharT,Traits> )
greift auf die aktuelle Übereinstimmung zu
(öffentliche Elementfunktion von std::regex_iterator<BidirIt,CharT,Traits> )
greift auf aktuelle Teilübereinstimmung zu
(öffentliche Elementfunktion von std::regex_token_iterator<BidirIt,CharT,Traits> )

Keine Klassen der Standardbibliothek überladen operator & . Das bekannteste Beispiel für überladenen operator & ist die Microsoft COM-Klasse CComPtr , obwohl er auch in EDSLs wie boost.spirit vorkommen kann.

Keine Standardbibliotheksklassen überladen operator - > * . Es wurde vorgeschlagen, dass es Teil der Smart-Pointer-Schnittstelle sein könnte, und tatsächlich wird es in dieser Funktion von Aktoren in boost.phoenix verwendet, ist jedoch häufiger in EDSLs wie cpp.react zu finden.

Hinweise

Feature-Test-Makro Wert Std Funktion
__cpp_multidimensional_subscript 202110L (C++23) Mehrdimensionaler Subscript-Operator

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 1213 C++11 Indizierung eines Array-Rvalues ergab Lvalue als Xvalue neu klassifiziert
CWG 1458 C++98 Anwendung von & auf einen Lvalue eines unvollständigen Klassentyps, der
operator & deklariert, führte zu undefiniertem Verhalten
es ist nicht spezifiziert,
welches & verwendet wird
CWG 1642 C++98 die rechte Seite  in eingebauten Zeiger-auf-Mitglied-Zugriffsoperatoren konnte ein Lvalue sein kann nur ein Rvalue sein
CWG 1800 C++98 bei Anwendung von & auf ein nicht-statisches Datenelement einer
anonymen Union war unklar, ob die anonyme Union
am Ergebnistyp teilnimmt
die anonyme Union
ist nicht im
Ergebnistyp enthalten
CWG 2614 C++98 das Ergebnis von E1. E2 war unklar, wenn E2 ein Referenzmitglied oder Enumerator ist klargestellt
CWG 2725 C++98 wenn E2 eine statische Memberfunktion ist, ist E1. E2 wohlgeformt
selbst wenn es nicht der linke Operand von operator ( ) ist
E1. E2 ist in diesem Fall
fehlerhaft
CWG 2748 C++98 das Verhalten von E1 - > E2 war unklar, wenn E1 ein
Nullzeiger ist und E2 auf ein statisches Mitglied verweist
das Verhalten ist
in diesem Fall undefiniert
CWG 2813 C++98 E1 war kein verworfenes Wertexpression, wenn
E1. E2 ein statisches Mitglied oder Enumeration benennt
ist es
CWG 2823 C++98 das Verhalten von * expr war unklar, wenn expr
nicht auf ein Objekt oder eine Funktion zeigt
klargestellt

Siehe auch

Operator-Präzedenz

Operatorüberladung

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetisch Logisch Vergleich Member-Zugriff
Zugriff
Sonstige

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

Funktionsaufruf

a ( ... )
Komma

a, b
Bedingt

a ? b : c
Spezielle Operatoren

static_cast konvertiert einen Typ in einen anderen verwandten Typ
dynamic_cast konvertiert innerhalb von Vererbungshierarchien
const_cast fügt cv -Qualifizierer hinzu oder entfernt sie
reinterpret_cast konvertiert einen Typ in einen unverwandten Typ
C-Stil Cast konvertiert einen Typ in einen anderen durch eine Mischung aus static_cast , const_cast und reinterpret_cast
new erstellt Objekte mit dynamischer Speicherdauer
delete zerstört zuvor durch den new-Ausdruck erstellte Objekte und gibt den bezogenen Speicherbereich frei
sizeof fragt die Größe eines Typs ab
sizeof... fragt die Größe eines Pack ab (seit C++11)
typeid fragt die Typinformationen eines Typs ab
noexcept prüft, ob ein Ausdruck eine Exception werfen kann (seit C++11)
alignof fragt die Ausrichtungsanforderungen eines Typs ab (seit C++11)

C-Dokumentation für Memberzugriffsoperatoren