2016-01-08 18 views
8
#include <string> 

void f(std::string&& rref){ 
} 

void f(std::string s){ 
} 

int main() { 
    std::string s = "s"; 
    f(std::move(s)); 
} 

Ten kod powoduje niejednoznaczność i nie wiem dlaczego, być może, dokonałem wyraźnej konwersji na odniesienie rvalue.Niejednoznaczność w wywołaniu funkcji. Implicit konwersji?

Moja idea jest taka, że ​​RValue odniesienia może być niejawnie konwertowane tylko lwartość. Ale nie jestem pewien. Proszę wytłumacz.

+0

Jaka jest niejednoznaczność? Czy był komunikat o błędzie kompilatora? –

+0

Powtórzono błąd niejednoznaczności: 'błąd: wywołanie przeciążenia 'f (std :: remove_reference &> :: type)' jest niejednoznaczny. Uwaga: kandydatami są: ... – Ziezi

+3

Dlaczego potrzebne są dwa oddzielne przeciążenia tutaj? –

Odpowiedz

4

std::string można zainicjować na podstawie wartości ruski typu std::string. Zatem druga funkcja jest kandydatem.

Nie ma sensu, aby przeciążenia wartości i rwartości były uzasadnione. Bardziej normalne ustawienie jest mieć rvalue referencję i przeciążeń lwartość-reference:

void f(std::string&& rref); 
void f(std::string & lref); // or const& 

Obejmie wszystkie przypadki użycia.

+0

Oznacza to, że std :: string && zwracane przez std :: move mogą być konwertowane (przez konwertowanie konstruktora) std :: string (std :: string && other) na ciąg ? –

+1

@ J.Doe Tak, to prawda - 's' jest inicjowane z argumentu używającego tego konstruktora –

+0

@ M.M Kiedy zmieniam linie w main na' std :: string && s = "s"; f (s); ', wtedy nie ma dwuznaczności. Jesteś pewien, że to jest kwestia konstruktora, a nie 'std :: move' xvalue-ness? – TNW

Powiązane problemy