2010-01-30 8 views
33

§3.10 sekcja 9 mówi, że "wartości nieklasowe zawsze mają typy bez cv". To sprawiło, że zastanawiam ...wartości nieklasyczne zawsze mają typy niekwalifikujące się do cv

int foo() 
{ 
    return 5; 
} 

const int bar() 
{ 
    return 5; 
} 

void pass_int(int&& i) 
{ 
    std::cout << "rvalue\n"; 
} 

void pass_int(const int&& i) 
{ 
    std::cout << "const rvalue\n"; 
} 

int main() 
{ 
    pass_int(foo()); // prints "rvalue" 
    pass_int(bar()); // prints "const rvalue" 
} 

Zgodnie z normą, nie ma czegoś takiego jak const rvalue dla typów non-klasowych, jeszcze bar() woli wiążą się const int&&. Czy jest to błąd kompilatora?

EDIT: Najwyraźniej this również const RValue :)

EDIT: Ten problem wydaje się być rozwiązany w g ++ 4.5.0, obie linie print "rvalue" teraz.

+0

wow, doskonałe pytanie. Chciałbym móc głosować dwa razy. –

+0

Gdybym mógł, dałbym 100 punktów za odpowiedź. – Omnifarious

+0

Którego kompilatora używasz? g ++ 4.3.2 narzekał, że nie jest w stanie przeciążyć funkcji pass_int przy użyciu wariantu const. – rajeshnair

Odpowiedz

11

Komitet już wydaje się mieć świadomość, że jest to problem występujący w tej części normy. CWG issue 690 mówi o nieco podobnym problemie z dokładnie tą samą częścią standardu (w "dodatkowej notatce" z września 2009 r.). Domyślam się, że wkrótce nowy język zostanie opracowany dla tej części normy.

Edytuj: Właśnie przesłałem post na comp.std.C++, zwracając uwagę na problem i sugerując nowe sformułowanie dla odpowiedniego fragmentu normy. Niestety, będąc moderowaną grupą dyskusyjną, prawie wszyscy zapomną o tym pytaniu, zanim przejdzie przez kolejkę do zatwierdzenia.

+0

Po prostu edytuj nowe informacje w późniejszym terminie, pytanie powinno następnie pojawić się w zakładce * aktywny *. –

+0

Czy wiadomość została już zatwierdzona? – Omnifarious

+0

Wiadomość została zatwierdzona i opublikowana, ale nikt nie odpowiedział/nie odpowiedział (jeszcze?) –

2

Dobra uwaga. Chyba są dwie rzeczy, spojrzeć na: 1) jak wskazał rvalue thingsy non-klasy i 2) jak rozdzielczość przeciążenie działa:

Kryteria wyboru najlepszej funkcji są liczby argumentów jak również argumenty dopasować parametr typu lista-funkcji kandydat [...]

nie mam nic w standardzie, który mówi mi rvalues ​​non-klasy traktowane są specjalnie widoczne podczas rozdzielczość przeciążania.

Twoje pytanie jest pokryta w projekcie standardu mam chociaż (N-4411) nieco:

Co wchodzi w grę jest jednak równoległy odczyt odniesienia wiązania, ukryte sekwencje konwersji, referencje i przeciążenia Rozdzielczość ogólnie:

13.3.3.1.4 odniesienia wiązania

2 Gdy parametr typu odniesienia nie jest związany bezpośrednio z argumentuWyrażenie, sekwencja konwersji jest tą wymaganą do przekształcenia wyrażenia argumentu na bazowy typ odniesienia według do 13.3.3.1.

i

13.3.3.2 Ranking ukrytych sekwencji konwersji

3 Dwie ukryte sekwencje przeliczniki tej samej formie są nie do odróżnienia sekwencje konwersji, chyba że zastosowanie ma jeden z następujących zasad:

- Standardowa sekwencja konwersji S1 jest lepsza sekwencja inwersji niż standard
sekwencja konwersji S2 jeśli

- S1 i S2 są powiązaniami odniesienia (8.5.3) i nie odnosi się do utajonego parametrów obiektu dla nonstatic funkcji użytkownik deklarowanej bez REF-kwalifikacjach i albo S1 wiąże lwartości odniesienia do lwartości i S2 wiąże odniesienia RValue lub S1 wiąże RValue odniesienie do wartości i S2 łączy odniesienie do wartości l.

[Przykład:

int i; 
int f(); 
int g(const int&); 
int g(const int&&); 
int j = g(i); // calls g(const int&) 
int k = g(f()); // calls g(const int&&) 
Powiązane problemy