gpt4 book ai didi

c++ - Substitution 不失败有什么用

转载 作者:行者123 更新时间:2023-11-28 01:22:09 27 4
gpt4 key购买 nike

我有一个使用模板的 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 又名 unsigned int 重载;因为我希望替换不是失败!基本上,int 没有开始、结束元素,因此替换应该会失败,并且该函数不应成为候选函数的一部分。

然而,令我恐惧的是,我得到一个编译错误,const int 没有开始或结束成员。

Substitution 什么时候是失败的,什么时候不是。它只适用于类型吗?

最佳答案

Substitution Failure is Not An Error (SFINAE) 只关注重载解析期间模板参数的替换。它的基本意思是,如果在确定要调用哪个函数的过程中替换推导的模板参数导致在某处生成无效类型或表达式,那么这不会导致编译失败,而只会导致相应的函数不再被视为函数调用的潜在候选者。只有出现在函数模板(或部分类或变量模板特化)声明中的内容才能受 SFINAE 的约束。函数模板定义的潜在实例化发生在确定要准确调用哪个函数之后。如果模板参数的替换在函数模板定义的实例化期间导致无效构造,则此类替换失败很可能会导致错误。

在您的特定情况下,给定两个选项

String(std::size_t);

template <class ITER_WRAP>
String(const ITER_WRAP &iterator_begin_end);

调用String参数类型为 int 的构造函数将选择模板特化String<int>因为打电话 String(std::size_t)需要积分提升,其转换排名比 String<int> 的完全匹配更差给你……

关于c++ - Substitution 不失败有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55637984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com