Sto scavando un po 'le qualifiche di ref, seguendo una domanda precedente.Qual è l'uso del qualificatore ref `const &&`?
Dato il codice di esempio riportato di seguito;
#include <iostream>
#include <string>
#include <utility>
struct A {
std::string abc = "abc";
std::string& get() & {
std::cout << "get() &" << std::endl;
return abc;
}
std::string get() && {
std::cout << "get() &&" << std::endl;
return std::move(abc);
}
std::string const& get() const & {
std::cout << "get() const &" << std::endl;
return abc;
}
std::string get() const && {
std::cout << "get() const &&" << std::endl;
return abc;
}
};
int main()
{
A a1;
a1.get();
const A a2{};
a2.get();
A().get();
const A a3{};
std::move(a3).get();
}
e l'uscita è come ci si aspetterebbe:
get() &
get() const &
get() & &
get() const & &
Questo compila ed esegue con clang e gcc 4.9.1 (non con 4.9.0). Dal vivo sample here.
In codice generale (il campione è lì per vedere come il codice viene compilato ed eseguito).
- Quale sarebbe lo scopo della
const &&
ref-qualificazione su un metodo essere?
Il metodo è in grado di modificare il contenuto sull'oggetto (è const
), un tentativo di return std::move(abc);
dal metodo const &&
realtà non spostare il std::string
affatto. Presumibilmente vorresti essere in grado di modificare l'oggetto, poiché è un valore r e non sarà disponibile per molto tempo. Se fosse necessario rimuovere il metodo qualificato const &&
, il codice std::move(a3).method()
si collegherebbe al metodo qualificato const &
, il che avrebbe senso.
- cosa, se del caso, sarebbe la differenza semantica implicita essere compreso tra un metodo qualificato come
const &
e uno qualificato comeconst &&
? Cioè come cambierebbe l'implementazione o perché vorresti entrambi? - Il
std::string
potrebbe essere "spostato" fuori dall'oggetto temporaneo? - Che aspetto avrebbe una firma "canonica" per
std::string get() const &&
in questo caso?
"Se stai implementando un tipo di contenitore generico, quindi per completezza e correttezza, considera di aggiungerlo ed eseguire la stessa azione del metodo &&. " - Non puoi, perché il contenitore e il suo contenuto devono essere trattati come 'const'. Il metodo 'const &' qualificato verrà chiamato invece per 'const' rvalue object access. – Potatoswatter
@Potatoswatter. Che è come è specificato nelle estensioni della libreria C++ per 'optional' et. al. I metodi '&&' e 'const &&' hanno lo stesso effetto (n4082, sezione 5.3.5 para 11, 20 ecc.). Vale la pena notare che GCC ha un problema nel selezionare il metodo corretto dato un valore const, ma clang no.Penso che il punto qui sia che, in generale, non c'è alcun uso, ma ci sono alcuni casi angolari che potrebbero essere necessari (e poi considerare attentamente perché ne hai bisogno). – Niall