https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95143

--- Comment #6 from Bernd Baumanns <familiebaumanns at gmail dot com> ---
simplified source (without include type_traits):
----------------------------
class false_type
{
public:
    static constexpr bool value = false;
};

class true_type{
public:
    static constexpr bool value = true;
};

template<class T>
T&& declval() noexcept;

template<typename T, typename U, typename = U>
struct is_static_castable : false_type
{};
template<typename T, typename U>
struct is_static_castable<T, U, decltype(static_cast<U>(declval<T>()))> :
true_type
{};

class Base
{};

struct A
{};

class B: public Base
{};

int main()
{
    constexpr auto canCast = is_static_castable<A, B>::value;
    static_assert(!canCast);
    constexpr auto canCast2 = is_static_castable<A, A>::value;
    static_assert(canCast2);
    return 0;
}

Reply via email to