首页 > 解决方案 > 没有按预期工作的简单特征(MSVC 与 gcc 和 clang)以及如何修复它

问题描述

以下示例具有可以手动与类关联的简单特征。如果没有给出明确的定义,则应发出编译器错误。

在 MSVC 上,这按预期工作(插入笑话),而 gcc&clang 总是GetDef()用 the实例化一般,static_assert因此总是无法编译。据称该标准要求这样做。

如何解决此问题以在任何(插入形容词)编译器上工作?请不要发布过于复杂的解决方法,必须有一个简单的方法。

template <typename T>
auto constexpr GetDef()
{
    static_assert( false, "undefined type" );
}

class MyClass {};    
class MyDefinedClass {};    

template <>
auto constexpr GetDef<int>()
{
    return 1;
}

template<typename T> struct Trait {};

template <>
auto constexpr GetDef<MyDefinedClass>()
{
    return Trait<MyDefinedClass>();
}

int main() 
{
    using Def1 = decltype( GetDef<int>() );               // these fail on gcc/clang
    using Def2 = decltype( GetDef<MyDefinedClass>() );

    //using Def3 = decltype( GetDef<MyClass>() );         // <== this one must fail
}

这是一个编译器资源管理器链接。

标签: c++templatestypetraits

解决方案


推荐阅读