我有一个关于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不匹配?
谢谢
需要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的内存块的指针。 如果将