2012-05-14 32 views
6

Tại sao sau đây không được phép vào C++C++ quá tải với một tham số 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

mối liên hệ giữa câu hỏi ban đầu của bạn và chỉnh sửa của bạn là gì? Hai câu hỏi dường như không liên quan. –

+0

Tôi đã xóa nó. – Avinash

Trả lời

5

Nó không thực sự trả lời tại sao, nhưng nó được xác định bởi tiêu chuẩn, §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.

này chỉ có nghĩa là vòng loại cv của các đối số được bỏ qua trong việc giải quyết tình trạng quá tải.

Một tương tự (nhưng không tương đương) ví dụ với sự tham khảo các công trình:

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

vì ở đây các loại khác nhau, trường hợp đầu tiên là một tham chiếu đến char, thứ hai một tham chiếu đến const char (như trái ngược tham chiếu const tới char).

3

Khi nói đến hoạt động các thông số, charchar const là những kiểu dữ liệu tương tự.

+1

Chúng không phải là cùng một kiểu dữ liệu. Các vòng loại cv chỉ không được xem xét cho độ phân giải quá tải. – juanchopanza

3

Điều này vẫn còn mơ hồ. Khi nó được gọi với một đối số nhân vật, một phiên bản sẽ sao chép đối số và nói "OK, bạn có thể thay đổi bản sao". Người kia sẽ sao chép đối số và nói "OK, bạn không thể thay đổi bản sao." Làm thế nào là trình biên dịch phải biết liệu nó có thể hoặc không thể thay đổi một bản sao của một cái gì đó? Nó có thể làm hoặc là tốt.

2

vì nó mơ hồ khi bạn đang đi qua như thế này

s.Method('x');

gì phiên bản bạn nên suy nghĩ được gọi là?

0

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

const biểu thị biến mà là có giá trị thiết lập, mà không thể được thay đổi sau khi tuyên bố. Nó không phải là một kiểu dữ liệu khác.

+0

Trợ năng? Làm sao? Các vòng loại truy cập làm điều đó (riêng tư/được bảo vệ/công khai), không phải là vòng loại const-volatile. – xtofl

+0

như trong bạn không thể sửa đổi giá trị vào một ngày sau đó sau khi khai báo. Có lẽ thuật ngữ tôi sử dụng không phải là tốt nhất. Câu trả lời đã chỉnh sửa. – CosminO

6

Tại sao sau đây không được phép trong C++?
Lý do rất giống với trình biên dịch cung cấp cho bạn dưới dạng lỗi biên dịch:
Vì chúng không rõ ràng!

Tại sao những phương pháp này không rõ ràng?
Câu trả lời ngắn gọn: Bởi vì tiêu chuẩn C++ nói như vậy.

Lý do cơ bản đằng sau các phương thức quá tải này không rõ ràng là gì?
Trình biên dịch không biết liệu người gọi muốn để điều trị các giá trị của truyền lập luận như một const hay không, không có cách nào cho trình biên dịch để xác định rằng với những thông tin trong tầm tay.

Lưu ý nhấn mạnh vào chuyển giá trị vào đây, đối số đang được chuyển theo giá trị và do đó sự mơ hồ. Nếu đối số là được chuyển bởi tham chiếu thì trình biên dịch biết chắc chắn cách người gọi muốn xử lý đối số vì sau đó đối tượng thực tế đang được truyền và do đó trình biên dịch có thể thực hiện lựa chọn quá tải thích hợp.

Ví dụ sau cung cấp ý tưởng rõ ràng hơn cho giải thích ở trên.

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

Tiêu chuẩn nói hai tờ khai là tương đương (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) 
Các vấn đề liên quan