gpt4 book ai didi

c++ - 为什么 SFINAE 在它应该工作的地方导致编译器错误?

转载 作者:太空狗 更新时间:2023-10-29 19:49:47 25 4
gpt4 key购买 nike

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

  • 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())。我很想知道这里出了什么问题。

最佳答案

为什么这么迂回?直接的特征类怎么样:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com