2010-11-18 51 views
5

Hôm nay tôi phát hiện ra rằng có thể khai báo hàm trong tiêu đề có một chữ ký và triển khai nó trong tệp nguồn có chữ ký khác (tương tự). Ví dụ: như thế này:Xác định hàm có chữ ký khác

// THE HEADER example.hpp 

#ifndef EXAMPLE_HPP 
#define EXAMPLE_HPP 

int foo(const int v); 

#endif 

// THE SOURCE FILE example.cpp 

#include "example.hpp" 

int foo(int v) // missing const 
{ 
    return ++v; 
} 

Điều này có được cho phép không? Hay đây là phần mở rộng của trình biên dịch (Tôi đang sử dụng g ++ 4.3.0)?

CHỈNH SỬA Tôi đang biên dịch với mức cảnh báo có thể xảy ra và có thể xảy ra tối đa và tôi vẫn không nhận được cảnh báo hoặc lỗi.

+0

Bạn đã đọc Tiêu chuẩn? – Abyx

Trả lời

12

Để xác định chữ ký chức năng, bất kỳ số cấp cao nhấtconst nào đều bị bỏ qua. Điều này là do nó không ảnh hưởng đến người gọi chức năng. Các thông số chức năng được truyền theo giá trị trong mọi trường hợp, do đó chức năng không thể ảnh hưởng đến các đối số được truyền vào.

Mức cao nhất const không ảnh hưởng đến phần thân của hàm. Nó xác định có hay không tham số có thể được thay đổi trong phần thân của hàm. Đó là chức năng tương tự như tuyên bố mặc dù.

Vì vậy, có, nó là hợp pháp và việc khai báo và định nghĩa đề cập đến cùng chức năng và không phải là quá tải.

Tham chiếu chuẩn: 8.3.5 [dcl.fct]/3: "[...] Loại hàm được xác định bằng các quy tắc sau. [...] Mọi số cv-qualifier sửa đổi tham số loại ... [...] Như vậy cv-vòng loại chỉ ảnh hưởng đến định nghĩa của tham số trong cơ thể của hàm, chúng không ảnh hưởng đến kiểu hàm. [...] "

+0

+1 cho "cấp độ vòng loại const cao nhất". Bạn không thể rõ ràng hơn thế. –

+0

Tuyệt. Đoạn đó thậm chí còn trả lời câu hỏi của tôi. –

5

int là loại giá trị cơ bản, công cụ sửa đổi const không có bất kỳ ảnh hưởng nào tại đây. Không có vấn đề gì bạn làm với int của bạn trong chức năng, điều này sẽ không bao giờ được nhìn thấy bởi người gọi.

Bạn không thể làm điều này với int &. Trong trường hợp đó, sự hiện diện hoặc vắng mặt của const thực sự có liên quan cho người gọi, vì int được gọi là có thể được sửa đổi.

Các vấn đề liên quan