为什么主模板必须有default = void
void_t spezialization why does primary template has to have default = void?
我有一个关于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不能工作
我所理解的是,这两个函数将具有相同的签名(带有void),但将使用更专门的签名(第二个)。但是为什么它不能用int呢?第二个带void的仍然是首选的,不是吗?
=int是否不匹配SFINAE ?
谢谢!
void
是必需的,这样void_t<decltype(...)>
表达式的结果将与主模板的默认参数匹配。
考虑类可赋值和不可赋值的情况:
可转让的:
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指定void
参数,因此我们在默认参数中指定它:
template<typename _Tp, typename _Up, typename = void>
// ^^^^^^^^^^^^^^^
我们可以很容易地选择void
以外的类型,但是使用它会显式地表明我们不关心类型,我们只是使用它来利用SFINAE。例如,我们可以定义int_t
,并将int
作为默认实参。只要它们匹配,我们就可以在需要时使用部分专门化。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 为什么主模板必须有default = void