Std::optional-ZuweisungsoperatorenC++

Programme in C++. Entwicklerforum
Anonymous
 Std::optional-Zuweisungsoperatoren

Post by Anonymous »

Mein Verweis bezieht sich auf die Optionen (4), (5) und (6) von std::optional::operator=.
Unter der Voraussetzung, dass

Die Klassenvorlage std::optional einen optionalen enthaltenen Wert verwaltet, d. h. einen Wert, der vorhanden sein kann oder nicht.

(4) aus den Linkzuständen im Beschreibung:

Die Funktion nimmt nicht an der Überladungsauflösung teil, es sei denn std::decay_t (bis C++20)

Code: Select all

std::remove_cvref_t
(seit C++20) ist nicht std::optional, std::is_constructible_v ist wahr, std::is_assignable_v ist wahr und mindestens eine der folgenden Aussagen ist wahr: Die obige Implikation scheint zu sein, dass U nicht std::optional ist, aber da std::optional T sein könnte, wie korreliert diese Bedingung mit der anderen Bedingung:

Code: Select all

std::is_constructible_v
ist wahr, std::is_assignable_v ist wahr

Außerdem, wenn T kein Skalartyp ist, wie kann die Zuweisung dann möglicherweise funktionieren, wenn std::decay_t nicht T ist?
(5) und (6) geben an:

Diese Überladungen nehmen nicht an der Überladungsauflösung teil, es sei denn, die folgenden Bedingungen sind erfüllt:
  • Code: Select all

    T
    ist nicht konstruierbar, konvertierbar oder aus einem Ausdruck des Typs (möglicherweise const) std::optional konstruierbar, konvertierbar oder zuweisbar, d. h.
  • die folgenden 12 Typmerkmale sind alle falsch:

    Code: Select all

    std::is_constructible_v
  • Code: Select all

    std::is_constructible_v
  • Code: Select all

    std::is_constructible_v
  • Code: Select all

    std::is_constructible_v
  • Code: Select all

    std::is_convertible_v
  • Code: Select all

    std::is_convertible_v
  • Code: Select all

    std::is_convertible_v
  • Code: Select all

    std::is_convertible_v
  • Code: Select all

    std::is_assignable_v
  • Code: Select all

    std::is_assignable_v
  • Code: Select all

    std::is_assignable_v
  • Code: Select all

    std::is_assignable_v


Auch std::optional könnte U sein, und wenn ja, wie funktioniert die Zuweisung?
Die Beschreibung lautet weiter:

Für Überladung (5), std::is_constructible_v und std::is_assignable_v sind beide wahr.
Für Überladung (6) sind std::is_constructible_v und std::is_assignable_v beide wahr.

Wäre dies nicht der Fall, wenn std::optional U enthalten würde?
Sollte davon ausgegangen werden, dass std::optional und std::optional keine gültigen Werte haben, um die oben genannten offensichtlichen Widersprüche aufzulösen?
Basierend auf dem Testcode unten sind std::optional und T unterschiedlich Typen.

Code: Select all

#include
#include
#include
#include
#include

using std::optional;
using std::is_same;
using std::string;
using std::boolalpha;
using std::cout;
using std::endl;

int main (){
optional opt("yes");
string s("yeah");

cout

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post