为什么在尝试类成员指针时,SFINAE 技巧对非类类型不起作用?
出于好奇,我尝试了 is_class 使用 sizeof()
技巧构造。以下是代码:
template<typename T>
struct is_class
{
typedef char (&yes)[7];
typedef char (&no)[3];
static yes check (int T::*);
static no check (...);
enum { value = (sizeof(check(0)) == sizeof(yes)) };
};
问题是当我实例化 is_class
时,它给出编译错误:
error: creating pointer to member of non-class type ‘int’
现在,我的问题是,如果 int T::*
不适用于int
(或void*
等)那么为什么替换不会失败为是检查
。编译器不应该选择不检查
吗?
With curiosity, I was trying an alternate implementation of is_class construct using the sizeof()
trick. Following is the code:
template<typename T>
struct is_class
{
typedef char (&yes)[7];
typedef char (&no)[3];
static yes check (int T::*);
static no check (...);
enum { value = (sizeof(check(0)) == sizeof(yes)) };
};
Problem is when I instantiate is_class<int>
, it gives compile error:
error: creating pointer to member of non-class type ‘int’
Now, my question is, if int T::*
is not applicable for int
(or void*
etc.) then why doesn't substitution fail for yes check
. Shouldn't compiler select the no check
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
yes
和no
不是模板,SFINAE 不可能应用于它们。您需要这样做:现在 SFINAE 可以启动了。
yes
andno
are not templates, SFINAE cannot possibly apply to them. You need to do this:Now SFINAE can kick in.