Tại sao static_cast cần thiết trong việc triển khai is_nothrow_constructible của gcc?


11

Lấy từ việc thực hiện GCC type_traitstại sao static_castcần thiết ở đây?

template <typename _Tp, typename... _Args>
struct __is_nt_constructible_impl
    : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> {};

template <typename _Tp, typename _Arg>
struct __is_nt_constructible_impl<_Tp, _Arg>
    : public integral_constant<bool,
                               // Why is `static_cast` needed here?
                               noexcept(static_cast<_Tp>(declval<_Arg>()))> {};

Sự không nhất quán đó có vẻ kỳ lạ
Các cuộc đua Lightness trong quỹ đạo

4
Bạn nên đặt câu hỏi như thế này trong danh sách gửi thư libstdc ++ có liên quan
Các cuộc đua Lightness trong Orbit

Câu trả lời:


12

Một kiểu không thể xây dựng từ danh sách đối số nếu khai báo biến được phát minh

T t(declval<Args>()...);

sẽ được hình thành tốt và được biếtkhông ném ngoại lệ . Trong trường hợp đối số số này, điều này là tương đương (khả năng phá hủy modulo noexcept, xem LWG 2116 ) với sự hình thành tốt và không bị biến dạng của biểu thức chuyển đổi loại

T(declval<Args>()...)

Tuy nhiên, trong trường hợp đối số duy nhất, biểu thức T(declval<Args>())được coi là biểu thức truyền , có thể gọi const_castreinterpret_cast ; việc sử dụng rõ ràng củastatic_cast khôi phục sự tương đương với mẫu khai báo.

Để làm ví dụ cụ thể , hãy xem xét các loại:

struct D;
struct B { operator D&&() const; };
struct D : B {};

Dưới đây là một static_casttừ B constđể D&&phải sử dụng toán tử chuyển đổi, nhưng một dàn diễn viên biểu hiện có thể bỏ qua các nhà điều hành chuyển đổi và như vậy là noexcept. Vì vậy, bỏ qua static_castsẽ cho kết quả sai cho is_nothrow_constructible<D&&, B const>.


Vì vậy, static_castcần thiết để biểu thức luôn luôn được coi là direct initializationthay vì như cast expression?
João Pires

1
@ JoãoPires có, đúng vậy. Vẫn chưa chính xác những gì được yêu cầu bởi tiêu chuẩn bởi vì không thể kiểm tra ngoại lệ của một tuyên bố sử dụng noexcepttoán tử, nhưng nó gần hơn rất nhiều.
ecatmur

cảm ơn đã giúp đỡ! : D
João Pires
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.