Namensräume
Varianten
Aktionen

operator==<small>(std::expected)</small>

Von cppreference.com
< cpp‎ | utility‎ | expected
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
Primäre Vorlage
template< class T2, class E2 >

  requires (!std::is_void_v<T2>)
friend constexpr bool operator==( const expected& lhs,

                                  const std::expected<T2, E2>& rhs );
(1) (seit C++23)
template< class E2 >

friend constexpr bool operator==( const expected& lhs,

                                  const std::unexpected<E2>& unex );
(2) (seit C++23)
template< class T2 >
friend constexpr bool operator==( const expected& lhs, const T2& val );
(3) (seit C++23)
void partielle Spezialisierung
template< class T2, class E2 >

  requires std::is_void_v<T2>
friend constexpr bool operator==( const expected& lhs,

                                  const std::expected<T2, E2>& rhs );
(4) (seit C++23)
template< class E2 >

friend constexpr bool operator==( const expected& lhs,

                                  const std::unexpected<E2>& unex );
(5) (seit C++23)

Führt Vergleichsoperationen auf std::expected Objekten durch.

1) Vergleicht zwei std::expected Objekte. Die Objekte sind gleich, wenn und nur wenn sowohl lhs als auch rhs erwartete Werte enthalten, die gleich sind, oder beide unerwartete Werte enthalten, die gleich sind.

Wenn einer der folgenden Ausdrücke fehlerhaft ist oder sein Ergebnis nicht nach bool konvertierbar ist, ist das Programm fehlerhaft

(bis C++26)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn alle folgenden Ausdrücke wohlgeformt sind und ihre Ergebnisse nach bool konvertierbar sind

(seit C++26)
  • *lhs == *rhs
  • lhs.error() == rhs.error()
2) Vergleicht ein std::expected Objekt mit einem std::unexpected Objekt. Die Objekte sind gleich, wenn und nur wenn lhs einen unerwarteten Wert enthält, der gleich unex.error() ist.

Wenn der Ausdruck lhs.error() == unex.error() fehlerhaft ist oder sein Ergebnis nicht nach bool konvertierbar ist, ist das Programm fehlerhaft.

(bis C++26)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Ausdruck lhs.error() == unex.error() wohlgeformt ist und sein Ergebnis nach bool konvertierbar ist.

(seit C++26)
3) Vergleicht ein std::expected Objekt mit einem erwarteten Wert. Die Objekte sind gleich, wenn und nur wenn lhs einen erwarteten Wert enthält, der gleich val ist.

Wenn der Ausdruck *lhs == val fehlerhaft ist oder sein Ergebnis nicht nach bool konvertierbar ist, ist das Programm fehlerhaft.

(bis C++26)

Dieser Überladung nimmt nur an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:

  • T2 ist keine Spezialisierung von std::expected.
  • Der Ausdruck *lhs == val ist wohlgeformt und sein Ergebnis ist nach bool konvertierbar.
(seit C++26)
4) Vergleicht zwei std::expected Objekte. Die Objekte sind gleich, wenn und nur wenn lhs und rhs beide erwartete Werte darstellen, oder beide unerwartete Werte enthalten, die gleich sind.

Wenn der Ausdruck lhs.error() == rhs.error() fehlerhaft ist oder sein Ergebnis nicht nach bool konvertierbar ist, ist das Programm fehlerhaft.

(bis C++26)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Ausdruck lhs.error() == rhs.error() wohlgeformt ist und sein Ergebnis nach bool konvertierbar ist.

(seit C++26)
5) Vergleicht ein std::expected Objekt mit einem std::unexpected Objekt. Die Objekte sind gleich, wenn und nur wenn lhs einen unerwarteten Wert enthält, der gleich unex.error() ist.

Wenn der Ausdruck lhs.error() == unex.error() fehlerhaft ist oder sein Ergebnis nicht nach bool konvertierbar ist, ist das Programm fehlerhaft.

(bis C++26)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn der Ausdruck lhs.error() == unex.error() wohlgeformt ist und sein Ergebnis nach bool konvertierbar ist.

(seit C++26)

Diese Funktionen sind für die normale unqualifizierte oder qualifizierte Suche nicht sichtbar und können nur durch argumentabhängige Suche gefunden werden, wenn std::expected<T, E> eine zu den Argumenten assoziierte Klasse ist.

Der Operator != wird aus operator== synthetisiert.

Inhalt

[bearbeiten] Parameter

lhs, rhs - std::expected Objekt(e) zum Vergleichen
unex - std::unexpected Wert, mit dem lhs verglichen wird
val - Wert, mit dem der erwartete Wert in lhs verglichen wird

[bearbeiten] Rückgabewert

1) lhs.has_value() != rhs.has_value() ? false :
    (lhs.has_value() ? *lhs == *rhs : lhs.error() == rhs.error())
2) !lhs.has_value() && static_cast<bool>(lhs.error() == unex.error())
3) lhs.has_value() && static_cast<bool>(*lhs == val)
4) lhs.has_value() != rhs.has_value() ? false :
    lhs.has_value() || static_cast<bool>(lhs.error() == rhs.error())
5) !lhs.has_value() && static_cast<bool>(lhs.error() == unex.error())

[bearbeiten] Ausnahmen

Wirft, wann und welche Ausnahme der Vergleich auslöst.

[bearbeiten] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_constrained_equality 202411L (C++26) beschränkte Vergleichsoperatoren für std::expected

[bearbeiten] Beispiel

#include <expected>
#include <iostream>
#include <string_view>
 
using namespace std::string_view_literals;
 
int main()
{
    auto x1{"\N{GREEN HEART}"sv};
    auto x2{"\N{CROSS MARK}"sv};
    std::expected<std::string_view, int> e1{x1}, e2{x1}, e3{x2};
    std::unexpected u1{13};
 
    std::cout << "Overload (1):\n"
              << e1.value() << (e1 == e2 ? " == " : " != ") << *e2 << '\n'
              << e1.value() << (e1 != e3 ? " != " : " == ") << *e3 << "\n\n";
 
    std::cout << "Overload (2):\n"
              << e1.value() << (e1 == u1 ? " == " : " != ") << u1.error() << '\n';
    e1 = std::unexpected{13};
    std::cout << e1.error() << (e1 == u1 ? " == " : " != ") << u1.error() << '\n';
    e1 = std::unexpected{31};
    std::cout << e1.error() << (e1 != u1 ? " != " : " == ") << u1.error() << '\n';
 
    std::cout << "Overload (3):\n"
              << *e1 << (e1 == x1 ? " == " : " != ") << x1 << '\n'
              << *e1 << (e1 != x2 ? " != " : " == ") << x2 << "\n\n";
}

Ausgabe

Overload (1):
💚 == 💚
💚 != ❌
 
Overload (2):
💚 != 13
13 == 13
31 != 13
 
Overload (3):
💚 == 💚
💚 != ❌

[bearbeiten] Siehe auch

als unerwarteter Wert dargestellt
(Klassenschablone) [bearbeiten]