std::is_assignable<int, int>::value == false
in einer übereinstimmenden Implementierung (z. B. clang / libc ++, gcc / libstdc ++, aber nicht VS2012).
Intuitiv bedeutet dies, dass ein Ausdruck wie int x = 3;
ungültig ist. Die Angabe von is_assignable
besagt jedoch, dass beide Seiten der Zuweisung in std::add_rvalue_reference<T>::type
konvertiert werden, und daher muss std::is_assignable<int, int>::value
auf false
ausgewertet werden (weil int
+ &&
- & gt; int&&
, was ein nicht zuordenbarer Wert).
Warum ist std::is_assignable
so konzipiert, oder verstehe ich etwas falsch, was is_assignable<int, int>::value
wirklich bedeutet?
Ähnliche Diskussionen:
In diesen Eigenschaften und mit T
, das kein Lvalue-Referenztyp ist, impliziert T
einen Rvalue.
Bei vielen benutzerdefinierten Typen T
ist es durchaus sinnvoll, rvalue-Typen zuzuweisen. Und es ist sogar in einigen Zusammenhängen sehr nützlich:
Im obigen Ausdruck ist v[0]
ein rvalue, dem zugewiesen wird. Und wenn vector<bool>
ein schlechtes Beispiel ist, macht der folgende neue C ++ 11-Code dasselbe:
Oben wird das Ergebnis von do_something()
einem rvalue std::tuple
zugewiesen. Das Zuweisen von rvalues ist nützlich und sogar üblich, wenn auch nicht in den allermeisten Verwendungen von Zuweisungen.
So std::is_assignable
ermöglicht es, die Unterscheidung zwischen der Zuweisung eines rvalue und eines lvalue zu bestimmen. Wenn Sie den Unterschied kennen müssen, kann std::is_assignable
die Arbeit für Sie erledigen.
Wenn Sie es mit einem häufigeren Fall zu tun haben, z. B. nur versuchen herauszufinden, ob ein Typ T
Kopie zuweisbar ist oder nicht, dann verwenden Sie is_copy_assignable<T>
. Diese Eigenschaft wird buchstäblich in is_assignable
definiert und zwingt die LHs zu einem Lvalue:
So wird std::is_copy_assignable<int>::value
wie erwartet wahr.
Verwenden Sie is_copy_assignable
als Ihre erste Wahl oder is_move_assignable
, wenn Sie das auch brauchen. Nur wenn diese Eigenschaften für Sie nicht funktionieren (vielleicht, weil Sie sich eine heterogene Zuordnung ansehen müssen), sollten Sie direkt is_assignable
verwenden. Und dann müssen Sie sich mit der Frage beschäftigen, ob Sie rvalues auf den lhs zulassen möchten oder nicht, um Fälle zu berücksichtigen, die ein vector<bool>::reference
oder ein tuple
von Referenzen beinhalten könnten. Sie müssen explizit auswählen, ob Sie solche Fälle in Ihrer is_assignable-Abfrage zulassen möchten.
Zum Beispiel:
%Vor%Tags und Links c++ c++11 typetraits