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- ist kein Skalartyp;
Code: Select all
T - ist nicht T.
Code: Select all
std::decay_t
Code: Select all
std::is_constructible_vAuß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:
- ist nicht konstruierbar, konvertierbar oder aus einem Ausdruck des Typs (möglicherweise const) std::optional konstruierbar, konvertierbar oder zuweisbar, d. h.
Code: Select all
T - die folgenden 12 Typmerkmale sind alle falsch:
Code: Select all
std::is_constructible_v Code: Select all
std::is_constructible_vCode: Select all
std::is_constructible_vCode: Select all
std::is_constructible_vCode: Select all
std::is_convertible_vCode: Select all
std::is_convertible_vCode: Select all
std::is_convertible_vCode: Select all
std::is_convertible_vCode: Select all
std::is_assignable_vCode: Select all
std::is_assignable_vCode: Select all
std::is_assignable_vCode: 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
Mobile version