Warum ist std :: is_assignable nicht intuitiv?

8

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:

ThreeBit 12.11.2013, 03:14
quelle

2 Antworten

13

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:

%Vor%

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:

%Vor%

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:

%Vor%

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%     
Howard Hinnant 12.11.2013 04:44
quelle
3

std::is_assignable<int, int>::value == false bedeutet, dass "ein int litteral nicht auf einen int litteral wirken kann" (unter anderem).

Ihre Aussage int x = 3 ist std::is_assignable<int&, int>::value .

Für weitere Informationen: Ссылка

    
Johan 12.11.2013 13:07
quelle

Tags und Links