No código a seguir, tento usar um vetor v1
feito de referências de um tipo e um vetor v2
feito de uma referência de um tipo:
#include <string>
#include <vector>
int main (int argc, char* argv[])
{
std::string object ("foobar");
std::string& refobj = object;
std::vector<std::reference_wrapper<decltype(object)>> v1;
// The following line doesn't compile => error: forming pointer to reference type ‘std::__cxx11::basic_string<char>&
std::vector<std::reference_wrapper<decltype(refobj)>> v2;
std::vector<std::reference_wrapper<std::remove_reference_t<decltype(refobj)>>> v3;
}
Como esperado, o código é compilado para, v1
mas não para v2
, o que também deve estar ok, IMHO; nesse caso, o wrapper de referência não deve fazer nada, pois o tipo fornecido já é uma referência.
Observe que posso conseguir o que desejo com o vetor, v3
mas o código parece um pouco complicado.
Pergunta : por que o compilador não fica satisfeito durante a compilação v2
? Em outras palavras, por que devo primeiro remover a referência de tipo antes de adicionar uma com reference_wrapper
?
reference_wrapper
na verdade, não "adiciona uma referência". Apenas emula a semântica de referência, mas ao mesmo tempo permite religar a "referência". A religação não é possível com referências. Essa é uma das razões pelas quaisstd::reference_wrapper
existe em primeiro lugar.Poderia
std::reference_wrapper
retirar a referência para você? Sim, poderia fazer o mesmo que você fez manualmente. No entanto, tentar lidar com todos os tipos que não correspondemstd::reference_wrapper
está além do escopo dostd::reference_wrapper
. Obter um erro do compilador é "bom o suficiente". Além disso, seria bastante confuso quandostd::reference_wrapper<T>::type
poderia ser diferente deT
.Você pode usar
std::ref
: