std::assignable_from
| Definiert in der Header-Datei <concepts> |
||
| template< class LHS, class RHS > concept assignable_from = |
(seit C++20) | |
Das Konzept assignable_from<LHS, RHS> spezifiziert, dass ein Ausdruck des von RHS spezifizierten Typs und der Wertkategorie an einen lvalue-Ausdruck zugewiesen werden kann, dessen Typ von LHS spezifiziert wird.
Inhalt |
[bearbeiten] Semantische Anforderungen
Gegeben
-
lhs, ein lvalue, der auf ein Objektlcopyverweist, sodass decltype((lhs))LHSist, -
rhs, ein Ausdruck, sodass decltype((rhs))RHSist, -
rcopy, ein separates Objekt, das gleichrhsist,
assignable_from<LHS, RHS> wird nur modelliert, wenn
- std::addressof(lhs = rhs) == std::addressof(lcopy) (d. h. der Zuweisungsausdruck ergibt einen lvalue, der auf den linken Operanden verweist);
- Nach der Auswertung von lhs = rhs
- ist
lhsgleichrcopy, es sei denn,rhsist ein nicht-const xvalue, das auflcopyverweist (d. h. die Zuweisung ist eine Selbst-Move-Zuweisung). - wenn
rhsein glvalue ist- Wenn es sich um einen nicht-const xvalue handelt, befindet sich das Objekt, auf das er verweist, in einem gültigen, aber nicht spezifizierten Zustand;
- Andernfalls wird das Objekt, auf das er verweist, nicht geändert;
- ist
[bearbeiten] Gleichheitserhaltung
Ausdrücke, die in requires-Ausdrücken der Standardbibliothekskonzepte deklariert sind, müssen gleichheitserhaltend sein (sofern nicht anders angegeben).
[bearbeiten] Hinweise
Zuweisung muss keine totale Funktion sein. Insbesondere, wenn die Zuweisung an ein Objekt x dazu führen kann, dass ein anderes Objekt y geändert wird, dann ist x = y wahrscheinlich nicht im Definitionsbereich von =. Dies geschieht typischerweise, wenn der rechte Operand direkt oder indirekt vom linken Operanden besessen wird (z. B. mit Smart Pointern zu Knoten in einer knotenbasierten Datenstruktur oder mit etwas wie std::vector<std::any>).
[bearbeiten] Beispiel
#include <atomic> #include <concepts> #include <string> int main() { // Normal basic usage, checks lvalue reference assignment static_assert(std::is_assignable_v<int&, int>); static_assert(std::assignable_from<int&, int>); static_assert(std::is_assignable_v<std::string&, std::string>); static_assert(std::assignable_from<std::string&, std::string>); // Fundamental types don't support assignment to an rvalue static_assert(!std::is_assignable_v<int, int>); static_assert(!std::assignable_from<int, int>); // std::assignable_from doesn't accept all valid assignment expressions: // rvalue reference assignment static_assert(std::is_assignable_v<std::string&&, std::string>); static_assert(!std::assignable_from<std::string&&, std::string>); // rvalue assignment static_assert(std::is_assignable_v<std::string, std::string>); static_assert(!std::assignable_from<std::string, std::string>); // std::atomic::operator= returns by value static_assert(std::is_assignable_v<std::atomic<int>&, int>); static_assert(!std::assignable_from<std::atomic<int>&, int>); }
[bearbeiten] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 18.4.8 Konzept
assignable_from[concept.assignable]
- 18.4.8 Konzept
- C++20 Standard (ISO/IEC 14882:2020)
- 18.4.8 Konzept
assignable_from[concept.assignable]
- 18.4.8 Konzept
[bearbeiten] Siehe auch
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Zuweisungsoperator für ein bestimmtes Argument hat (Klassenvorlage) |