带有is_invocable_v的clang ++中的ICE /我的代码有效吗?

问题描述

以下代码无法使用clang(核心转储/ ICE)进行编译-但使用gcc和msvc可以正常编译。 我的代码有效吗?我可以更改一些适用于当前clang版本的东西吗?

#include <type_traits>
#include <iostream>

struct A {
    void Func() {
    }
};

struct B {
    static void Func() {
        std::cout << "Hello from struct \n";
    }
};

template<typename T>
void Do(){
    auto lambda = [](auto&& cls) -> decltype(
       std::remove_const_t<std::remove_reference_t<decltype(cls)>>::Func()
    ) {};

    if constexpr (!std::is_invocable_v<decltype(lambda),A>){
        std::cout << "no static Foo\n";
    } else{
        T::Foo();
    }
}

int main()
{
    Do<A>();
    Do<B>();
    
    return 0;
}

代码的目的是检测例如S::Func()是否为有效表达式。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)