Почему `decltype (static_cast (…))` не всегда `T`?

Для следующего кода первое утверждение проходит, но второе не выполняется

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
}

Почему последнее утверждение не выполняется, и static_cast<T> не всегда возвращает T?

20
задан Eric 5 October 2019 в 21:39
поделиться