&& bei const member function
-
Hi,
ich hab gerade mal etwas cppquiz gespielt und bin auf folgendes gestoßen (#233):
#include <type_traits> #include <iostream> using namespace std; struct X { int f() const&&{ // was macht das? return 0; } }; int main() { auto ptr = &X::f; cout << is_same_v<decltype(ptr), int()> << is_same_v<decltype(ptr), int(X::*)()>; }
Was macht "const&&"? Das hab ich noch nie gesehen. Und seit wann gibt es das? C++17?
-
Das ist ein ref-qualifier, der vorgibt, dass
f
nur auf rvalues aufgerufen werden darf.
Das Ergebnis des Programms sollte 0 0 sein. Ref-qualifier sind wie cv-qualilfier ein Teil des Funktionstyps (schon seit dem urspruenglichen wording).
Siehe auch https://en.cppreference.com/w/cpp/language/member_functions.
-
@Columbo Ok, dankeschön. Hast du das jemals in produktiv-code verwendet?
-
@Jockelx sagte in && bei const member function:
@Columbo Ok, dankeschön. Hast du das jemals in produktiv-code verwendet?
Ich interpretiere diese Frage mal als "Wozu ist das gut, in welchen Fällen kann man das anwenden?". Wenn du stattdessen wirklich an Columbos persönlicher Programmiergeschichte interessiert sein solltest, dann lies folgenden Text nicht: https://akrzemi1.wordpress.com/2014/06/02/ref-qualifiers/
-
@SeppJ Eigentlich war ich nur an Columbos persönlicher Programmiergeschichte interessiert, aber wenn du schon extra was verlinkst, dann guck ich mal rein
-
@Jockelx Selten. Es findet dort Anwendung, wo Objekte die (auch indirekt) Ressourcen besitzen, diese ohne Kopie in den Rueckgabewert einer solchen ref-qualifizierten Funktion moven koennen, weil das Objekt ja sowieso gleich zerstoert wird (wer
move(x).f()
aufruft und dann x weiter benutzt ist eben selber Schuld lol).
Das ist aber nur sinnvoll, wenn diese Funktion auch mit einiger Wahrscheinlichkeit auf rvalues aufgerufen werden wird. Und das geschieht eher fuer bestimmte Hilfsklassen/proxies, als fuer gewoehnlichen Enduser/Anwendungscode.optional
ist da ein gutes Beispiel.