2013-09-05 14 views
5

Szukałem API dla std::optional<T> na cppreference. Byłem ciekawy, jak zadziała value_or. Patrząc tam, wydaje się, że są dwa przeciążenia:Ciągłe deklarowanie deklaracji funkcji i &&

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

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

Jakie są const& i && spływu deklarację funkcji? Jaka jest różnica między deklarowaniem funkcji jako const i deklarowaniem jej jako const&?

+0

To jest faktycznie funkcja C++ 11, do której kompilatory ostatnio uzyskały wsparcie. – chris

+0

@chris Pozdrawiam. Wiedziałem o referencjach rvalue do * tego, ale ponieważ jest to prawdopodobnie jedna z ostatnich cech do zastosowania, nie przejmowałem się ich w ogóle. – Yuushi

+0

@chris szczerze czekałem, aby odpowiedzieć na to pytanie Widziałem odpowiedź w C++ elementarz jakiś czas temu, szkoda, nigdy nie zdałem sobie sprawy, że to dupe :( – aaronman

Odpowiedz

2

ampresand po funkcja oznacza, że ​​this musi być lwartością odwrotnie podwójne ampersand oznacza, że ​​muszą to być rval, const po prostu mówi, że jest to nonmodifiable lval lub rval

Więc funkcja kwalifikowane z & tylko działa na modyfikowalne lvl i jeśli kwalifikowane z && działa tylko na rval. Domyślam się, że const && naprawdę nie ma sensu, ponieważ const & może wiązać się z tymczasowym, więc kwalifikator const robi tylko coś dla lval.