Std :: is_feft được triển khai như thế nào?


82

Làm thế nào sau đây là một thực hiện cho std::is_function?

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

(từ Tài liệu tham khảo CPP )

Dường như với tôi, một intsẽ là một chức năng theo định nghĩa này. Tôi đang thiếu gì?


10
Hãy suy nghĩ về !is_constphần này.
aschepler

Tại sao các loại chức năng không thể là const? Điều này có liên quan đến các loại gớm ghiếc?
jtbandes

4
@jtbandes đó là vì các hàm là một trong số ít những thứ trong C ++ không phải là đối tượng.
Ayxan

1
Tôi đoán bởi vì theo một nghĩa nào đó, nó luôn luôn là
Rịa

Tôi cảm thấy như tiêu đề là sai lệch. "Làm thế nào đây là một triển khai std :: is_feft hợp lệ?" có vẻ phù hợp hơn
val nói Phục hồi lại

Câu trả lời:


73

Chúng ta hãy xem xét các điều kiện khi chúng xuất hiện:
Nếu const Tkhông phải là const ( constkhông thực sự áp dụng cho các loại hàm vì các hàm không phải là đối tượng) và Tkhông phải là một tham chiếu ( constkhông áp dụng cho các tham chiếu vì cùng một lý do) , đó là một loại chức năng. int(hoặc bất kỳ loại không tham chiếu chức năng nào khác) sẽ không phù hợp vì is_const<const int>::valuetrue.

Theo C ++ 17 Tiêu chuẩn §11.3.5 Chức năng / phần 7 : (Nhấn mạnh mỏ)

Tác dụng của cv-Qualifier-seq trong một bộ khai báo hàm không giống như thêm chất lượng cv lên trên loại hàm. Trong trường hợp sau, vòng loại cv bị bỏ qua. [Lưu ý: Loại chức năng 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. - ghi chú cuối] [...]


5
À .... tôi đã thiếu "const" bên trong phần is_const của cái này. Điều đó có ý nghĩa.
Rian Quinn

54

Chỉ có hai loại loại trong ngôn ngữ không thể có đủ tiêu chuẩn: loại tham chiếu và loại chức năng. Vì vậy, nếu const Tkhông phải là loại đủ điều kiện, có nghĩa Tlà loại chức năng hoặc loại tham chiếu. Nếu bạn có thể loại trừ các loại tham chiếu, thì bạn chỉ còn lại các loại chức năng.

Lưu ý rằng một loại chức năng mang một vòng loại cv, chẳng hạn như int(int) const, không phải là một loại đủ điều kiện const. Đây là một ví dụ về "loại chức năng gớm ghiếc", chỉ có công dụng thực sự là soạn thảo hoặc phân tách các loại hàm con trỏ thành thành viên. Loại int(int) constkhông thể có được bằng cách thêm trình độ const trên đầu trang int(int). Thay vào đó, constáp dụng cho tham số đối tượng ngụ ý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.