2016-08-08 17 views
20

Giả sử chúng ta muốn khai báo hàm thành viên const qua typedef:thành viên chức năng và typedef Const, C++

typedef int FC() const; 
typedef int F(); 

struct A 
{ 
    FC fc;   // fine, we have 'int fc() const' 
    const F fc; // not fine, 'const' is ignored, so we have 'int fc()' 
}; 

Kể từ const bị bỏ qua chương trình biên dịch tốt. Tại sao const bị bỏ qua cho chức năng? Vì chúng ta có thể tạo thành con trỏ const theo cách này, điều duy nhất tôi có thể nghĩ là 'di sản C'. Tiêu chuẩn có nói gì về nó không?

+0

'int() const' chủ yếu là một nửa loại, vì nó chỉ có thể áp dụng cho lớp học để có các hàm thành viên. – Jarod42

+0

Không thể là "di sản C" vì C không có chức năng thành viên. – Jarod42

+0

Có, nhưng trong C chúng tôi vẫn có thể có: typedef int F(); const F f; mặc dù 'int f() const' có thể sai cú pháp. – igntec

Trả lời

19

Tiêu chuẩn C++ 14, [dcl.fct] pt. 7:

Ảnh hưởng của cv-qualifier-seq trong trình khai báo hàm không giống như thêm cv-qualification trên đầu trang của loại hàm. Trong trường hợp sau, các vòng loại cv bị bỏ qua. [Lưu ý: một loại hàm có cv-qualifier-seq không phải là loại đủ điều kiện cv; không có loại chức năng đủ điều kiện cv. - cuối note]

Ví dụ:

typedef void F(); 

struct S { 
    const F f; // OK: equivalent to: void f(); 
}; 

Vì vậy, đây là một hành vi chính xác.

2

Thay đổi này được thực hiện bởi CWG 295, về cơ bản để giảm bớt việc lập trình chung. Hãy xem xét:

template<class F> 
void meow(const F& f) { f(); } 
void purr(); 

meow(purr); 

Bỏ qua thêm const cho phép tính năng này hoạt động.

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