2015-05-21 15 views
8

Tôi bắt đầu chuyển vC++ 10/boost 1.48 codebase thành vC++ 12/boost 1.57 và tôi nhận được lỗi tăng :: tùy chọn không thể chuyển thành bool. Tôi nghĩ rằng đây là một tính năng của tăng :: tùy chọn, nó đã được loại bỏ?Đã tăng :: dàn diễn viên tiềm ẩn của tùy chọn để bool biến mất?

Ví dụ:

bool fizz(){ 
    boost::optional<int32_t> buzz; 
    return buzz; 
} 

cho

Error 21 error C2440: 'return' : cannot convert from 'boost::optional<int32_t>' to 'bool' 

Trả lời

10

Yes. Boost 1.55 vẫn sử dụng Safe Bool Idiom:

// implicit conversion to "bool" 
// No-throw 
operator unspecified_bool_type() const { return this->safe_bool() ; } 

Boost 1.56, Boost 1.57Boost 1.58 hiện nay sử dụng macro này:

BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT() 

đó là khoảng:

#if !defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) 
    explicit operator bool() const noexcept; 
#else if !defined(BOOST_NO_UNSPECIFIED_BOOL) 
    operator boost::detail::unspecified_bool_type() const noexcept; 
#else 
    operator bool() const noexcept; 
#endif 

Tôi đoán bạn không có BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS được xác định - và vì trình biên dịch của bạn hỗ trợ các toán tử chuyển đổi rõ ràng, bạn sh có thể giữ nó theo cách đó!

+0

Việc triển khai 1.58 không thay đổi. Nó vẫn sử dụng macro. –

+0

@ T.C. Rất tiếc, đã sửa. – Barry

+0

Cảm ơn câu trả lời chi tiết. Cho tôi biết về macro rất hữu ích vì chúng tôi phải hỗ trợ công cụ cũ trong nửa năm nữa. – sellsword

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