2013-09-05 7 views
5

Ich schaute auf die API für std::optional<T> auf cppreference. Ich war neugierig, wie value_or funktionieren würde. Suchen Sie es, so scheint es, gibt es zwei Überlastungen:Trailing const & or && on Funktionsdeklaration

template< class U > 
constexpr T value_or(U&& value) const&; 

template< class U > 
T value_or(U&& value) &&; 

Was sind die const& und && Hinter die Funktionsdeklaration? Was ist der Unterschied zwischen der Deklaration einer Funktion als const und der Deklaration als const&?

+0

Dies ist eigentlich eine C++ 11-Funktion, für die Compiler kürzlich Unterstützung erhalten haben. – chris

+0

@chris Prost. Ich wusste von rvalue Verweisen auf * das, aber da es wahrscheinlich eine der letzten Funktionen ist, die implementiert werden, hatte ich mich überhaupt nicht damit beschäftigt, sie zu untersuchen. – Yuushi

+0

@chris ehrlich ich hatte gewartet, um diese Frage zu beantworten Ich sah die Antwort in C++ Primer vor einer Weile, schade, ich habe nie realisiert, es war ein Betrogener :( – aaronman

Antwort

2

Ein ampresand nach der Funktion bedeutet, dass this ein L-Wert sein muss, umgekehrt der Doppelampersand bedeutet, muss es ein rval sein, die const sagt nur, dass es sich um ein nicht änderbar lval ist oder rval

So eine Funktion mit & qualifiziert nur arbeitet an einem modifizierbaren lval und wenn mit && qualifiziert funktioniert nur auf einem rval. Ich denke, ein const && macht wirklich keinen Sinn, da ein const & an ein temporäres binden kann, so dass das const-Qualifikationsmerkmal nur irgendetwas für das lval tut.