代码之家  ›  专栏  ›  技术社区  ›  Klaus

在SFINAE上下文中使用的表达式中使用的静态_断言

  •  3
  • Klaus  · 技术社区  · 7 年前

    如果我使用 static_assert 在SFINAE的条件内,编译器发出错误并停止。

    template < int i>
    class X
    {
        static_assert( i != 4 );
        public:
            static constexpr bool value = true;
    };
    
        template < typename T >
    typename std::enable_if< T::value, void>::type Do(  )
    {
        std::cout << "one" << std::endl;
    }
    
        template < typename T >
    typename std::enable_if< !T::value, void>::type Do( )
    {
        std::cout << "two" << std::endl;
    }
    
    
    int main()
    {
        Do<std::true_type>();
        Do<std::false_type>();
    
        // ###########
        Do<X<1>>();
        Do<X<4>>();
    }
    

    这是我们应该期待的行为吗?

    1 回复  |  直到 7 年前
        1
  •  6
  •   StoryTeller - Unslander Monica    7 年前

    这是我们应该期待的行为吗?

    X ,而不是在模板函数的直接上下文中。因此,这不仅仅是替换失败,程序将是病态的。有一个(尽管不是规范性的)说明,进一步支持这种方式。

    (强调注释)

    8 如果替换导致无效的类型或表达式,请键入 格式错误,如果使用 这个程序仍然格式不正确。访问检查作为 替代过程。结束注释]只有无效的类型和表达式 在函数类型及其模板的直接上下文中 参数类型可能导致扣减失败[注: 这个 类模板专门化和/或函数的实例化 功能等。此类效果不在直接上下文中,且 [完注]

    在你的特殊情况下 X

    // No static assertion
    static constexpr bool value = (i != 4);
    

    甚至

    template <int i>
    struct X : std::bool_constant< i != 4 >{};