【问题标题】:Errors with std::enable_if<>std::enable_if<> 错误
【发布时间】:2016-02-25 12:09:18
【问题描述】:

我正在尝试在 C++ 中使用带有 STL std::enable_if&lt;&gt; 的基本 SFINAE 模式,但在第一个障碍中失败了:

#include <type_traits>

template< typename T >
typename std::enable_if< true, bool >::type    // compiles fine
//std::enable_if< false, bool >::type // lots of errors
myFunction( T val )
{
    // do stuff
    return true;
}

void main()
{
    int i = 0;
    myFunction( i );
}

在第一种情况下,enable_if&lt;true,bool&gt; 按预期工作。在第二种情况下,enable_if&lt;false,bool&gt; 我希望编译会失败,并且只会出现一个类似于 'myFunction': identifier not found 的错误,但是我会收到多个以 'type' : is not a member of 'std::enable_if&lt;false,bool&gt;' 开头的错误,然后从那里传播更多错误。

一方面,编译器确实给出了错误,但另一方面,我认为重点是替换失败是不是错误吗?我错过了一个非常明显的观点吗?还是 VC 2013 有 SFINAE 问题?

谢谢

【问题讨论】:

标签: c++ c++11 visual-c++ visual-studio-2013 stl


【解决方案1】:

当您使用std::enable_if&lt;false, bool&gt;::type 字面意思时,没有任何东西可以替代。因此,代码总是错误的,编译器会报告错误。 SFINAE 仅适用于以“F”(失败)结束的“S”(替代)。

【讨论】:

    【解决方案2】:

    原因是 Visual C++(和 gcc)都使用 true 案例的部分特化来实现 std::enable_if,而对于通用案例,它只是一个空结构,这当然是 false 的结果:

    template<bool _Test,class _Ty = void>
    struct enable_if
    {   // type is undefined for assumed !_Test
    };
    
    template<class _Ty>
    struct enable_if<true, _Ty>
    {   // type is _Ty for _Test
      typedef _Ty type;
    };
    

    他们甚至评论了type 对于false 案例未定义的事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2014-08-29
      • 2013-06-03
      • 2015-07-13
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      相关资源
      最近更新 更多