Tại sao `Dectype (static_cast <T> (Mạnh))` không phải luôn luôn là` T`?


24

Đối với mã sau đây, tất cả trừ xác nhận cuối cùng đều vượt qua:

template<typename T>
constexpr void assert_static_cast_identity() {
    using T_cast = decltype(static_cast<T>(std::declval<T>()));
    static_assert(std::is_same_v<T_cast, T>);
}

int main() {
    assert_static_cast_identity<int>();
    assert_static_cast_identity<int&>();
    assert_static_cast_identity<int&&>();
    // assert_static_cast_identity<int(int)>(); // illegal cast
    assert_static_cast_identity<int (&)(int)>();
    assert_static_cast_identity<int (&&)(int)>(); // static assert fails
}

Tại sao khẳng định cuối cùng này thất bại, và static_cast<T>không phải lúc nào cũng trở lại T?


Tôi thêm T_cast i{1};tôi nhận được invalid initialization of non-const reference of type 'T_cast' {aka 'int (&)(int)'} from an rvalue of type '<brace-enclosed initializer list>', vì vậy vì bất kỳ lý do gì T_castint (&)(int)hơn là a int (&&)(int).
Kevin

Câu trả lời:


21

Điều này được mã hóa cứng trong định nghĩa của static_cast:

[expr.static.cast] (nhấn mạnh của tôi)

1 Kết quả của biểu thức static_­cast<T>(v)là kết quả của việc chuyển đổi biểu thức vthành loại T. Nếu Tlà một loại tham chiếu giá trị hoặc một tham chiếu giá trị cho loại hàm, kết quả là một giá trị ; if Tlà một tham chiếu giá trị cho loại đối tượng, kết quả là một giá trị x; mặt khác, kết quả là một giá trị. Các static_­cast nhà điều hành sẽ không bỏ đi sự kiên định.

decltype tôn trọng danh mục giá trị của toán hạng của nó và tạo ra một tham chiếu giá trị cho các biểu thức giá trị.

Lý do có thể là do tên hàm luôn luôn là giá trị và do đó, một giá trị của loại hàm không thể xuất hiện "trong tự nhiên". Như vậy, đúc theo kiểu đó có lẽ ít ý nghĩa.


câu hỏi này giải quyết chi tiết hơn "rvalue [s] của một loại chức năng [không] xuất hiện [ing]" trong tự nhiên ""
Eric
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.