当前位置: 首页 > 知识库问答 >
问题:

void\u t spezialization为什么主模板必须有default=void?[副本]

胡玉书
2023-03-14

我有一个关于void_t元功能的问题,显示在这个视频https://www.youtube.com/watch?v=a0FliKwcwXE和41:25问的问题。

我将尝试用这个代码片段来显示我的问题:

template<typename _Tp, typename _Up, typename = void>
class __is_assignable_helper_af2: public std::false_type
{
};


template<typename _Tp, typename _Up>
class __is_assignable_helper_af2<_Tp, _Up,
     void_t<decltype(std::declval<_Tp&>() = std::declval<_Up&>())>> 
  : public std::true_type
{
};

为什么第一个模板需要默认类型void?int不起作用。

我所理解的是,这两个函数将具有相同的签名(无效),但将使用更特殊的签名(第二个)。但是为什么它不能和int一起工作呢?第二个有空虚的仍然是更受欢迎的,不是吗?

=int是否与SFINAE不匹配?

谢谢

共有1个答案

赵禄
2023-03-14

需要space以使该的结果void_t

考虑类是可分配的和不可分配的情况:

可转让的:

void_t<decltype(std::declval<_Tp&>() = std::declval<_Up&>())>
//reduces to
void_t<type given from assignment>
//reduces to
void

不可转让:

void_t<decltype(std::declval<_Tp&>() = std::declval<_Up&>())>
//substitution failure, remove from candidate set

现在,在可分配的情况下,仅当模板参数匹配时,才会选择部分专门化,即它们需要采用以下形式:

__is_assignable_helper_af2<_Tp, _Up, void>

我们希望客户端代码只传递两个参数,而不是显式地指定要发生SFINAE的val参数,因此我们在默认参数中指定它:

template<typename _Tp, typename _Up, typename = void>
//                                   ^^^^^^^^^^^^^^^

为此,我们可以很容易地选择一种类型,而不是void,但使用它可以清楚地表明,我们不关心类型,我们只是使用它来利用SFINAE。例如,我们可以定义int\u t,并将int作为默认参数。只要它们匹配,我们就可以在需要时使用部分专门化。

 类似资料:
  • 为了方便起见,我将setter方法返回类型更改为对象,例如: 但在tomcat做出这一改变之后 PropertyNotFoundException: 为了消除这个异常,我将修饰符从private更改为public,但仍然得到相同的错误。所以我有两个问题; null

  • 我注意到,在使用扫描仪时,如果我想设置定界符或区域设置等属性,那么这样做的方法会返回扫描仪对象本身: 我不明白的是,如果属性被更改(而不是创建新对象),为什么它返回一个扫描器对象而不是void?这并不是说我必须将返回值存储在一个变量中——事实上,如果我尝试这样做,就像下面的代码中那样,Eclipse将发出消息:“lineScanner”在此位置未关闭:

  • 问题内容: 在API中 “ Void类是无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。” 什么是“无法实例化”的占位符类?什么时候使用?如果该类是“无法实例化的”,它有什么用? 和之间有什么区别? 问题答案: 在 唯一的一点 的是持有,这是有点像。如果您对返回的方法有一个反射性的引用,并获得其返回类型,则它将返回。 您不能也不应将其用于其他任何用途。

  • 所以我理解为什么从异步返回空洞通常没有意义,但我遇到了一种我认为完全有效的情况。请考虑以下人为的示例: 我意识到这是一个不寻常的例子,但我试图使其简单化和更普遍化。有人能向我解释为什么这是可怕的代码,以及我如何修改它以正确遵循约定吗? 谢谢你的任何帮助。

  • 在下面的代码中,为什么模板函数的显式扩展无法编译,而条形扩展却成功编译?实时链接-https://godbolt.org/z/o8Ea49KEb 请注意,这两个函数的主体中都使用了模板参数T2,唯一的区别是已手动替换条形图的函数参数。 这个问题是在阅读了std::c条件-无效参数类型“无效”后提出的,即使在测试“无效”并试图简化问题时也是如此。

  • 描述 (Description) C库函数void free(void *ptr)释放先前通过调用calloc,malloc或realloc分配的内存。 声明 (Declaration) 以下是free()函数的声明。 void free(void *ptr) 参数 (Parameters) ptr - 这是指向先前分配有要释放的malloc,calloc或realloc的内存块的指针。 如果将