2012-05-14 15 views
6

Dlaczego nie wolno następuje w C++C++ przeciążenie z jednym parametrem const

#include <iostream> 

class Sample { 
public: 
    void Method(char x); 
    void Method(char const x); 
}; 

void Sample::Method(char x) { 
    char y = x; 
} 

void Sample::Method(char const x) { 
    char y = x; 
} 

int main() { 
    Sample s; 
    return 0; 
} 
+0

Jaki jest związek między pierwotnego pytania i edycję? Te dwa pytania wydają się nie mieć związku. –

+0

I Usunięto to. – Avinash

Odpowiedz

5

Tak naprawdę nie odpowiedzieć dlaczego, ale to zależy od standardu, §1.3.10

The information about a function that participates in overload resolution (13.3): the types of its parameters and, if the function is a class member, the cv- qualifiers (if any) on the function itself and the class in which the member function is declared.

To po prostu oznacza, że ​​kwalifikacyjne CV argumenty są ignorowane w rozdzielczości przeciążenia.

Podobny (ale nie równoważnik) Przykład odniesieniami działa:

class Sample { 
public: 
    void Method(char& x) {} 
    void Method(const char& x) {} 
}; 

ponieważ tutaj typu są różne, to pierwszy przypadek jest odniesienie do char drugi odniesienie do const char (w przeciwieństwie do const odniesienie do char).

3

Kiedy przychodzi funkcjonować parametrów char i char const są tego samego typu danych.

+1

Nie są to ten sam typ danych. Kwalifikatory cv po prostu nie są brane pod uwagę przy rozdzielczości przeciążania. – juanchopanza

3

Jest to nadal niejednoznaczne. Gdy zostanie wywołany z argumentem znakowym, jedna wersja skopiuje argument i powie "OK, możesz zmienić kopię". Drugi skopiuje argument i powie "OK, nie możesz zmienić kopii". W jaki sposób kompilator powinien wiedzieć, czy może zmienić kopię czegoś? Może to zrobić dobrze.

2

bo to dwuznaczne gdy jesteś przejazdem jak ten

s.Method('x');

co wersja powinna myślisz nazwać?

0

http://duramecho.com/ComputerInformation/WhyHowCppConst.html

Ponieważ const oznacza, że ​​zmienna jako posiadające wartość, która nie może być zmieniona po deklaracji. To nie jest inny typ danych.

+0

Dostępność? W jaki sposób? Kwalifikatory dostępu robią to (prywatne/chronione/publiczne), a nie stałe kryteria. – xtofl

+0

jak w tobie nie można modyfikować wartości w późniejszym terminie po deklaracji. Może termin, którego używałem, nie był najlepszy. Edytowana odpowiedź. – CosminO

6

Dlaczego następujące czynności są niedozwolone w C++? Powód jest taki sam, jak kompilator podaje jako błąd kompilacji:
Ponieważ są niejednoznaczne!

Dlaczego te metody są niejednoznaczne?
Krótka odpowiedź: ponieważ standard C++ tak mówi.

Jakie są powody, dla których te przeciążone metody są niejednoznaczne?
Kompilator nie wie, czy rozmówca chce traktować wartość przekazywana argumentu jako const czy nie, nie ma sposobu na kompilator, aby określić, które z informacjami pod ręką.

Uwaga nacisk na przejściu przez wartość tutaj argument jest przekazywane przez wartość, a więc niejednoznaczność. Jeśli argument był przekazany przez odniesienie, wówczas kompilator wie na pewno, w jaki sposób wywołujący chce traktować argument, ponieważ wtedy przekazywany jest rzeczywisty obiekt, a zatem kompilator może dokonać wyboru właściwego przeciążenia.

Poniższy przykład daje jaśniejszy pomysł do powyższego wyjaśnienia.

Online Sample:

class Sample 
{ 
    public: 
     void Method(char &x){} 
     void Method(char const x){} 
     void Method(char const &x){} 
}; 


int main() 
{ 
    Sample s; 
    return 0; 
} 
2

Norma mówi te dwa oświadczenia są równoważne (13.1.3):

Parameter declarations that differ only in the presence or absence of const and/or volatile are equivalent. That is, the const and volatile type-specifiers for each parameter type are ignored when determining which function is being declared, defined, or called.

typedef const int cInt; 

int f(int); 
int f(const int);   // redeclaration of f(int) 
int f(int) { /* ... */ }  // definiton of f(int) 
int f(cInt) { /* ... */ } // error: redefiniton of f(int) 
Powiązane problemy