替代有什么用,不是失败
What is the use of Substitution is not failure
我有一个类,Jav::String,我使用模板。
class String
{
String();
String(std::size_t);
template <class ITER_WRAP>
String(const ITER_WRAP &iterator_begin_end);
}
我希望当我调用带有有符号整数的字符串时,就像MAX_PATH一样,它会调用 std::size_t 又名无符号 int 重载; 因为我希望替换不是失败!基本上,int 没有开始、结束元素,因此替换应该失败,并且该函数不应该是候选函数的一部分。
但是,令我恐惧的是,我得到了一个编译错误,const int 没有开始或结束成员。
什么时候替换是失败的,什么时候不是。它仅适用于类型吗?
替换失败不是错误 (SFINAE) 只涉及重载解析期间模板参数的替换。它的基本含义是,如果在确定要调用哪个函数的过程中替换推导的模板参数导致在某处生成无效的类型或表达式,那么这不会导致编译失败,而只是导致相应的函数不再被视为函数调用的潜在候选者。只有出现在函数模板(或部分类或变量模板专用化)声明中的内容才能受 SFINAE 的约束。函数模板定义的潜在实例化发生在确定要准确调用的函数之后。如果在函数模板定义的实例化过程中,模板参数的替换导致无效的构造,则这种替换失败将是一个错误。
在您的特定情况下,给定两个选项
String(std::size_t);
template <class ITER_WRAP>
String(const ITER_WRAP &iterator_begin_end);
调用具有int
类型参数的String
构造函数将选择模板专用化String<int>
因为调用String(std::size_t)
需要一个整体提升,其转换排名比String<int>
给你的完全匹配更差......
相关文章:
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 指示 Qi 变换属性失败的适当方法是什么?
- dynamic_cast什么时候会因为隐藏符号而失败?
- 什么时候标准::线程::连接会因no_such_process而失败
- 替代有什么用,不是失败
- 显式实例化失败的原因是什么
- QtDCM 编译失败的可能原因是什么?
- 错误 opencv 错误断言失败 (p [-1] <= 2) 是什么意思以及如何处理它?
- 查找函数在失败结果中应该返回什么
- 什么可能导致应用程序在工作几个小时后锁定获取 SIGABRT 失败
- 什么错误的逻辑导致我的链表的这个 push_back(..) 函数失败?
- c++.系统调用move什么时候会失败
- dynamic_cast失败意味着什么
- C++ 运行失败:退出值 2 - 我的代码出了什么问题?
- 我的复制构造函数导致使用我的类的方法失败.有人能看一眼,告诉我我做错了什么吗
- 在这个失败的C++类实例化中,我忽略了什么明显的事情
- 什么会导致罕见的 lchown() 失败:不允许操作
- 什么会导致 D3D11CreateDevice() 失败并出现E_FAIL
- 当我尝试caputre〔this〕时,用于回调函数的lambda表达式失败,原因是什么