我试图实现一个元程序,该程序查找给定的指针类型是否为 const。 IE。

  • is_const<TYPE*>::value 应该是 false
  • is_const<const TYPE*>::value 应该是 true

  • 以下是代码:
    template<class TYPE>
    struct is_const
    {
      typedef char yes[3];
      template<typename T>
      struct Perform
      {
        static yes& check (const T*&);
        static char check (T*&);
      };
    
      TYPE it;
      enum { value = (sizeof(Perform<TYPE>::check(it)) == sizeof(yes)) };
    };
    

    编译器错误消息是:

    In instantiation of ‘is_const<int*>’:
    instantiated from here
    error: no matching function for call to ‘is_const<int*>::Perform<int*>::check(int*&)’
    note: candidates are: static char (& is_const<TYPE>::Perform<T>::check(const T*&))[3] [with T = int*, TYPE = int*]
    note: static char is_const<TYPE>::Perform<T>::check(T*&) [with T = int*, TYPE = int*]
    

    我的重点已转移到错误消息上。如果您看到最后一行:

    note: static char is_const<TYPE>::Perform<T>::check(T*&) [with T = int*, TYPE = int*]
    

    如果我们真的替换 T = int*TYPE = int* 那么它真的应该匹配适当的函数( char check() )。我很想知道这里出了什么问题。

    最佳答案

    怎么这么绕?一个简单的 trait 类怎么样:

    #include <functional>
    
    template <typename T> struct is_const_ptr : std::false_type { };
    template <typename T> struct is_const_ptr<const T *> : std::true_type { };
    
    struct Foo {};
    
    int main()
    {
      std::cout << is_const_ptr<Foo*>::value << is_const_ptr<const Foo*>::value << std::endl;
    }
    

    关于c++ - 为什么 SFINAE 在它应该工作的地方导致编译器错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6586396/

    10-16 03:28