P :: ************ có nghĩa là gì trong tệp Boost khẳng định.hpp?


80

Trong boost / mpl / khẳng định.hpp , tôi thấy một cái gì đó như thế này:

template<class Pred>
struct eval_assert {
    typedef typename extract_assert_pred<Pred>::type P;
    typedef typename P::type p_type;
    typedef typename ::boost::mpl::if_c<p_type::value,
        AUX778076_ASSERT_ARG(assert<false>),
        failed ************ P::************
    >::type type;
};

Nếu cái đầu tiên ************có thể được coi là con trỏ của struct bị lỗi, thì nó P::************thực sự không có ý nghĩa gì đối với tôi. Đây có phải là tiêu chuẩn C ++ không?


38
Pointerception ...
Jakub Arnold

5
@deviantfan Trong mã sản xuất? Bạn sẽ ngạc nhiên. ;) Nhưng vấn đề ở đây là gây ra lỗi biên dịch bằng cách cố gắng đề cập đến một thành viên của Pvới mức độ chắc chắn rất cao rằng nó sẽ không tồn tại. (Trong C ++ 11 bạn muốn có thể chỉ cần sử dụng static_assert(false)thay vào đó, nhưng tất nhiên Boost có để được cầm tay để pre-C ++ 11.)
cdhowie

4
Lưu ý: Con trỏ 12 cấp có thể liên quan đến mức tối thiểu theo yêu cầu của tiêu chuẩn C.
TC

29
@PaulDraper nó thực sự đang đọc hunter2hunter2hunter2hunter2ở đây
xem

5
con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một con trỏ đến một thành viên của loại P
Kai

Câu trả lời:


100

Mục đích của đoạn mã này là giúp trình biên dịch tạo ra các thông báo lỗi "có thể nhìn thấy".

Trong static_assertthời kỳ trước , việc biên dịch một đoạn mã nặng về khuôn mẫu có thể dễ dàng tạo ra ~ 100 dòng thông báo lỗi ngay cả khi chỉ một lỗi duy nhất và 99% những dòng đó thường vô nghĩa.

Thủ thuật 10 con trỏ rất hữu ích để chỉ ra lỗi thực tế, ví dụ:

 BOOST_STATIC_ASSERT((std::is_same<T,U>));

Với T=void*U=char*biên dịch bằng gcc tạo ra ~ 10 dòng lỗi, nhưng bạn có thể dễ dàng thấy dòng lỗi liên quan:

error: no matching function for call to ‘assertion_failed(mpl_::failed************ std::is_same<void*, char*>::************)’

45

Plà một thành viên của kiểu con trỏ-tới-con trỏ-...-, trong đó thành viên là thành viên dữ liệu của kiểu con trỏ-đến-con trỏ-to -...- failed.

Trong trường hợp này, mục tiêu chỉ đơn giản là làm cho quá trình biên dịch không thành công bằng cách tham chiếu đến một thành viên của Pvới khả năng rất cao là nó sẽ không tồn tại. Trong C ++ 11, bạn chỉ cần sử dụng static_assertthay thế, nhưng tất nhiên Boost cần phải có tính di động đối với các phương ngữ trước C ++ 11.


19

F P::*là một "con trỏ đến thành viên Pcủa loại F".

F P::**là một "con trỏ trỏ tới thành viên Pcủa loại F".

Thêm *s thêm nhiều "con trỏ tới" ở phía trước.

Trong trường hợp Fnày failed ************, tức là "con trỏ tới con trỏ tới ... con trỏ tới failed".

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.