为什么使用某些类型特征的模板类型会导致模板扣除失败
Why using to template type with some type traits causes template deduction failure
我有一个简单的情况:
#include <iostream>
#include <type_traits>
template<typename T>
struct Handle_ {
T vlue;
};
template<typename T>
using Handle = Handle_<std::enable_if_t<true, T>>;
template<typename T>
void fooo(Handle<T> h, int a) {
}
int main() {
Handle<int> a;
fooo(a, 4);
}
不编译的
,因为fooo
的模板参数扣除失败。如果从Handle
使用std::enable_if_t
删除 - 它可以工作。
template<typename T>
using Handle = Handle_<T>;
在使用这种情况下创建某些依赖性的原因是什么?
这是因为 std::enable_if_t
是
template< bool B, class T = void >
using enable_if_t = typename enable_if<B,T>::type;
因此, T
在::
的左侧,这是一个未折叠的上下文。
还注意,一个别名将被视为其别名模板。别名本身不会参加扣除。
相关文章:
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 从具有部分专用化的boost:hana::set中提取类型失败
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 在 static_assert 中使用 std::is_base_of 由于类型不完整而失败
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- 添加类型名会导致程序编译失败
- 模板类型推断失败(std::空作为谓词)
- 为什么类型铸件仅在这句话中失败
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 使用比较函数对引用类型失败
- 从istream读取自定义类型失败时的预期行为
- 设置MP3编码器mft输出类型失败
- 编译不完整类型失败;循环依赖
- 访问具有lambda的成员函数内部的类模板参数类型失败
- 检查输入类型失败,C++
- 将 GetWindowLongPtr() 强制转换为模板化类型失败